জাভা, পরামিতিগুলিতে 3 টি বিন্দু


820

নিম্নলিখিত পদ্ধতিতে 3 টি বিন্দু বলতে কী বোঝায়?

public void myMethod(String... strings){
    // method body
}

উত্তর:


985

এর অর্থ শূন্য বা আরও বেশি স্ট্রিং অবজেক্ট (বা তাদের একটি অ্যারে) সেই পদ্ধতির জন্য আর্গুমেন্ট হিসাবে পাস হতে পারে।

এখানে "আর্গুমেন্টের সালিসী সংখ্যা" বিভাগটি দেখুন: http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html#varargs

আপনার উদাহরণে, আপনি এটি নীচের যে কোনও হিসাবে কল করতে পারেন:

myMethod(); // Likely useless, but possible
myMethod("one", "two", "three");
myMethod("solo");
myMethod(new String[]{"a", "b", "c"});

গুরুত্বপূর্ণ দ্রষ্টব্য: এইভাবে দেওয়া আর্গুমেন্টগুলি সর্বদা একটি অ্যারে থাকে - এমনকি যদি কেবল একটি থাকে। নিশ্চিত হয়ে নিন যে আপনি পদ্ধতির শরীরে সেভাবে আচরণ করে।

গুরুত্বপূর্ণ দ্রষ্টব্য 2: যে আর্গুমেন্টটি পায় তা ...অবশ্যই পদ্ধতির স্বাক্ষরে সর্বশেষ। সুতরাং, myMethod(int i, String... strings)ঠিক আছে, তবে myMethod(String... strings, int i)ঠিক নেই।

তার মন্তব্যে স্পষ্টতার জন্য ভাসকে ধন্যবাদ।


112
আপনি ভুল হয়ে গেছেন, সেই "এক বা একাধিক" তে, ভারারাগুলি দিয়ে আমরা 0 বা আরও নির্দিষ্ট করতে পারি এবং এটি সর্বদা পদ্ধতিতে সর্বশেষ পরামিতি হতে হবে। পদ্ধতি x (স্ট্রিং ... প্যারাম) কে x () বা পদ্ধতি y (স্ট্রিং প্রাম, স্ট্রিং ... প্যারাম) বলা যেতে পারে y ("1")
ড্যামিয়ান লেজস্কিস্কি - ভ্যাশ

2
আমি যদি আশা করি এটি কাজ করে। মাইমাথোদ ("এক", "দুই", "তিন", নতুন স্ট্রিং [] {"এ", "বি", "সি" "});
এসবি

2
কেন আপনাকে 0 টি পরামিতিটি দেওয়ার অনুমতি দেওয়া হচ্ছে? এটি সম্ভবত অ্যারেআইন্ডেক্সআউটআউটফাউন্ডস এক্সসেপশনকে নিয়ে যাবে। এখন আপনাকে সর্বদা সেই বিষয়টি বিবেচনায় নিতে হবে।
ওলে সডারস্টারম

11
কারণ তারা alচ্ছিক। এটি বিকাশকারীদের উপর নির্ভর করে যিনি তাদের শূন্য বা তার বেশি কিছু পরিচালনা করার পদ্ধতিটি সঠিকভাবে প্রয়োগ করতে alচ্ছিক যুক্তিগুলি ব্যবহার করার সিদ্ধান্ত নিয়েছেন।
কিসওয়া

@ ওলেসডার্সট্রাম আরেকটি কারণ হ'ল আনুষ্ঠানিক প্যারামিটারটি সংকলন-সময়ে একটি অ্যারেতে রূপান্তরিত করা হয়। তার মানে একটি অ্যারেতে পাস করা একই ফলাফল দেয়। যেহেতু একটি অ্যারের দৈর্ঘ্য সংকলন সময়ে জানা যায়নি, কমপক্ষে একটি উপাদান ছাড়ার সীমাবদ্ধতাটি কেবল কল করেই ছাড়ানো যেতে পারে someMethod(new SomeType[] { })। এটি হ্যাক হবে, তাই না?
এমসির সম্রাট

124

এই বৈশিষ্ট্যটিকে ভারাজস বলা হয় , এবং এটি জাভা ৫ এ প্রবর্তিত একটি বৈশিষ্ট্য যার অর্থ এই ফাংশনটি একাধিক Stringযুক্তি গ্রহণ করতে পারে :

myMethod("foo", "bar");
myMethod("foo", "bar", "baz");
myMethod(new String[]{"foo", "var", "baz"}); // you can even pass an array

তারপরে, আপনি Stringঅ্যারে হিসাবে বিভিন্নটি ব্যবহার করতে পারেন :

public void myMethod(String... strings){
    for(String whatever : strings){
        // do what ever you want
    }

    // the code above is is equivalent to
    for( int i = 0; i < strings.length; i++){
        // classical for. In this case you use strings[i]
    }
}

এই উত্তরটি কিসওয়াসা এবং লোরেঞ্জোর ... এবং গ্রাফাইনের মন্তব্য থেকে প্রচুর .ণ নিয়েছে।


13
যখন কোড বাইটকোড হিট, এটি হল একটি অ্যারের। বাকী সমস্ত কিছুই কেবল সংকলক দ্বারা সমর্থনযোগ্য সিনট্যাক্স।
ডোনাল ফেলো

আমি যদি সম্পাদনাগুলি সঠিকভাবে পড়ি তবে এই উত্তরটি কিসওয়ার এবং লোরেঞ্জোর কাছ থেকে প্রচুর orrowণ নিয়েছে।
ম্যাট মিশেল

3
@ গ্রাফ আপনার উত্তরটি সম্পাদনা করা এবং এটিকে একা না রেখে আরও সঠিক করার পক্ষে আরও ভাল। এবং যদি অন্য উত্তরটি আপনার উন্নতির উত্স হয়, তাই এটি যায়। কমপক্ষে তিনি এ সম্পর্কে সত্যবাদী (এবং আমি ধরে নিই যে তিনি অন্যান্য উত্তরগুলি যে তাকে সাহায্য করেছে ... অধিকার?)

1
@ আমি এটি উল্লেখ করার পরে তিনি কি সত্যই বলবেন যা যথেষ্ট ভাল। দেখার জন্য ধন্যবাদ.
ম্যাট মিচেল

23

এটি ভার্সেস :)

ভেরিয়েবল-দৈর্ঘ্যের আর্গুমেন্টগুলির জন্য সংক্ষিপ্তভাবে ভ্যারাগারস এমন একটি বৈশিষ্ট্য যা পদ্ধতিটিকে আর্গুমেন্টের ভেরিয়েবল সংখ্যা (শূন্য বা আরও বেশি) মেনে নিতে দেয়। ভারার্গসের সাহায্যে এমন পদ্ধতিগুলি তৈরি করা সহজ হয়ে উঠেছে যাতে চলক সংখ্যক আর্গুমেন্ট নেওয়া দরকার। ভেরিয়েবল আর্গুমেন্টের বৈশিষ্ট্যটি জাভা 5-এ যুক্ত করা হয়েছে।

ভারার্গসের সিনট্যাক্স

একটি ভারার্গ তথ্য প্রকারের পরে তিনটি উপবৃত্ত (তিনটি বিন্দু) দ্বারা সুরক্ষিত হয়, এর সাধারণ ফর্ম

return_type method_name(data_type ... variableName){
}  

Varargs জন্য প্রয়োজন

জাভা 5 এর পূর্বে, যদি চলক সংখ্যক তর্ক যুক্তির প্রয়োজন হয়, তবে এটি পরিচালনা করার দুটি উপায় ছিল

যদি আর্গুমেন্টের সর্বাধিক সংখ্যা থাকে তবে একটি পদ্ধতিটি ছোট এবং জ্ঞাত হতে পারে তবে পদ্ধতির ওভারলোড হওয়া সংস্করণ তৈরি করা যেতে পারে। কোনও পদ্ধতি গ্রহণ করতে পারে এমন আর্গুমেন্টের সর্বাধিক সংখ্যা যদি বড় বা / এবং অজানা ছিল তবে পদ্ধতির ছিল সেই আর্গুমেন্টগুলিকে একটি অ্যারেতে রেখে সেগুলি এমন একটি প্যাসেমে পাঠানো যা প্যারামিটার হিসাবে অ্যারে নেয়। এই 2 টি পদ্ধতির ত্রুটি-প্রবণ ছিল - প্রতিটি সময় প্যারামিটারের অ্যারে তৈরি করা এবং বজায় রাখা শক্ত - কারণ নতুন যুক্তি যুক্ত হওয়ার ফলে একটি নতুন ওভারলোডেড পদ্ধতি লেখার ফলস্বরূপ।

Varargs এর সুবিধা

একটি আরও সহজ বিকল্প প্রস্তাব। ওভারলোডেড পদ্ধতিগুলি লেখার প্রয়োজন নেই বলে কম কোড।

Varargs উদাহরণ

public class VarargsExample {
 public void displayData(String ... values){
  System.out.println("Number of arguments passed " + values.length);
  for(String s : values){
   System.out.println(s + " ");
  }
 }

 public static void main(String[] args) {
  VarargsExample vObj = new VarargsExample();
  // four args
  vObj.displayData("var", "args", "are", "passed");
  //three args
  vObj.displayData("Three", "args", "passed");
  // no-arg
  vObj.displayData();
 }
}
Output

Number of arguments passed 4
var 
args 
are 
passed 
Number of arguments passed 3
Three 
args 
passed 
Number of arguments passed 0

প্রোগ্রামটি থেকে দেখা যাবে যে পদ্ধতিতে পাস হওয়া আর্গুমেন্টগুলির সংখ্যা জানতে এখানে দৈর্ঘ্যটি ব্যবহৃত হয়। এটি সম্ভব কারণ ভারার্গগুলি সুস্পষ্টভাবে একটি অ্যারে হিসাবে পাস করা হয়েছে। ভারার্গস হিসাবে যে কোনও আর্গুমেন্ট পাস করা হয় তা অ্যারেতে সংরক্ষণ করা হয় যা ভারার্গ্সকে দেওয়া নাম দ্বারা উল্লেখ করা হয়। এই প্রোগ্রামে অ্যারের নাম মান হয়। এছাড়াও নোট করুন যে পদ্ধতিটি বিভিন্ন সংখ্যক আর্গুমেন্টের সাথে ডাকা হয়, প্রথমে চারটি আর্গুমেন্টের সাথে কল করুন, তারপরে তিনটি আর্গুমেন্ট এবং তারপরে শূন্য আর্গুমেন্ট সহ। এই সমস্ত কলগুলি একই পদ্ধতি দ্বারা পরিচালিত হয় যা ভারার্গস নেয়।

Varargs সঙ্গে সীমাবদ্ধতা

কোনও পদ্ধতিতে ভারার্গস প্যারামিটার সহ অন্যান্য প্যারামিটার থাকা সম্ভব, তবে সেই ক্ষেত্রে, ভ্যারাগস প্যারামিটারটি অবশ্যই পদ্ধতি দ্বারা ঘোষিত শেষ প্যারামিটার হতে হবে।

void displayValues(int a, int b, int  values) // OK
   void displayValues(int a, int b, int  values, int c) // compiler error

ভারার্গসের সাথে আর একটি বিধিনিষেধ হ'ল এখানে কেবল একটি ভারার্গ্স প্যারামিটার থাকতে হবে।

void displayValues(int a, int b, int  values, int  moreValues) // Compiler error

ওভারলোডিং ভ্যারাগস পদ্ধতিগুলি

ভারার্গ্স প্যারামিটার গ্রহণকারী কোনও পদ্ধতি ওভারলোড করা সম্ভব। ভারার্গস পদ্ধতিটি এর মাধ্যমে ওভারলোড হতে পারে -

এর ভারারগ প্যারামিটারের প্রকারটি আলাদা হতে পারে। অন্যান্য পরামিতি যুক্ত করে। ওভারলোডিং ভারার্গ্স পদ্ধতির উদাহরণ

public class OverloadingVarargsExp {
 // Method which has string vararg parameter
 public void displayData(String ... values){
  System.out.println("Number of arguments passed " + values.length);
  for(String s : values){
   System.out.println(s + " ");
  }
 }

 // Method which has int vararg parameter
 public void displayData(int ... values){
  System.out.println("Number of arguments passed " + values.length);
  for(int i : values){
   System.out.println(i + " ");
  }
 }

 // Method with int vararg and one more string parameter
 public void displayData(String a, int ... values){
  System.out.println(" a " + a);
  System.out.println("Number of arguments passed " + values.length);
  for(int i : values){
   System.out.println(i + " ");
  }
 }

 public static void main(String[] args) {
  OverloadingVarargsExp vObj = new OverloadingVarargsExp();
  // four string args
  vObj.displayData("var", "args", "are", "passed");

  // two int args
  vObj.displayData(10, 20);

  // One String param and two int args
  vObj.displayData("Test", 20, 30);
 }
}
Output

Number of arguments passed 4
var 
args 
are 
passed 

Number of arguments passed 2
10 
20

 a Test
Number of arguments passed 2
20 
30 

ভারার্গস এবং ওভারলোডিং অস্পষ্টতা

আমাদের বেশিরভাগ ভারে ভার্সড পদ্ধতি থাকা অবস্থায় কিছু ক্ষেত্রে কল অস্পষ্ট হতে পারে। আসুন একটি উদাহরণ দেখুন

public class OverloadingVarargsExp {
 // Method which has string vararg parameter
 public void displayData(String ... values){
  System.out.println("Number of arguments passed " + values.length);
  for(String s : values){
   System.out.println(s + " ");
  }
 }

 // Method which has int vararg parameter
 public void displayData(int ... values){
  System.out.println("Number of arguments passed " + values.length);
  for(int i : values){
   System.out.println(i + " ");
  }
 }

 public static void main(String[] args) {
  OverloadingVarargsExp vObj = new OverloadingVarargsExp();
  // four string args
  vObj.displayData("var", "args", "are", "passed");

  // two int args
  vObj.displayData(10, 20);

  // This call is ambiguous
  vObj.displayData();
 }
}

এই প্রোগ্রামে যখন আমরা কোনও পরামিতি ছাড়াই প্রদর্শনের ডেটা () পদ্ধতিতে কল করি তখন এটি ত্রুটি ছুঁড়ে দেয়, কারণ এই পদ্ধতিটি কল করার জন্য কম্পাইলার নিশ্চিত না displayData(String ... values)বা নাdisplayData(int ... values)

একইভাবে যদি আমাদের ওভারলোডেড পদ্ধতি থাকে যেখানে একটিতে varargএক ধরণের পদ্ধতি থাকে এবং অন্য পদ্ধতিতে varargএকই ধরণের একটি প্যারামিটার এবং প্যারামিটার থাকে, তবে আমাদের অস্পষ্টতা যেমন - এক্সপ - displayData(int ... values)এবংdisplayData(int a, int ... values)

এই দুটি ওভারলোডেড পদ্ধতিতে সর্বদা অস্পষ্টতা থাকবে।


15

এটি ভেরাগস (ভেরিয়েবল সংখ্যা আর্গুমেন্ট) পাস করার জাভা উপায় ।

আপনি যদি সি এর সাথে পরিচিত হন তবে ...এটি এটির সিনট্যাক্সের মতো যা এটি ব্যবহার করে printf:

int printf(const char * format, ...);

তবে একটি প্রকার নিরাপদ ফ্যাশনে: প্রতিটি যুক্তি নির্দিষ্ট ধরণের সাথে মেনে চলতে হয় (আপনার নমুনায়, সেগুলি সবই হওয়া উচিত String)।

আপনি কীভাবে ভারারা ব্যবহার করতে পারবেন এটির একটি সহজ নমুনা :

class VarargSample {

   public static void PrintMultipleStrings(String... strings) {
      for( String s : strings ) {
          System.out.println(s);
      }
   }

   public static void main(String[] args) {
      PrintMultipleStrings("Hello", "world");
   }
}

...যুক্তি আসলে একটি অ্যারের, তাই আপনি একটি পাস পারে String[]প্যারামিটার হিসাবে।


11

যুক্তিযুক্তভাবে, এটি সিনট্যাকটিক চিনির উদাহরণ, যেহেতু এটি অ্যারে হিসাবে যাইহোক প্রয়োগ করা হয় (যার অর্থ এটি অকেজো নয়) - আমি এটি পরিষ্কার রাখার জন্য একটি অ্যারে পাস করা পছন্দ করি এবং প্রদত্ত ধরণের অ্যারেগুলি সহ পদ্ধতিও ঘোষণা করি। বরং একটি উত্তর চেয়ে একটি মতামত, যদিও।


5

কিছুটা আলোকপাত করার জন্য, এটি জেনে রাখা গুরুত্বপূর্ণ যে ভার-আরগ প্যারামিটারগুলি কেবল একটিতে সীমাবদ্ধ এবং আপনার বেশ কয়েকটি ভার্-আর্ট প্যারাম থাকতে পারে না। উদাহরণস্বরূপ এটি অবৈধ:

public void myMethod(String... strings, int ... ints){
// method body
}


2

অ্যান্ড্রয়েড অ্যাসিঙ্কটাস্কের একটি বিখ্যাত পদ্ধতির মধ্যে এটি উপস্থিত রয়েছে যে তিনটি বিন্দুর ব্যবহারের একটি স্পষ্ট উদাহরণ দেখার সত্যিই একটি সাধারণ উপায় (এটি আজ আরএক্সজেএভিএর কারণে খুব বেশি ব্যবহৃত হয় না, গুগল আর্কিটেকচার উপাদানগুলির উল্লেখ না করে), আপনি এই শব্দটির সন্ধান করে এমন হাজার হাজার উদাহরণ খুঁজে পেতে পারেন এবং এটি বোঝার সর্বোত্তম উপায় এবং তিনটি বিন্দুর অর্থ আর কখনও ভুলে যাবেন না তারা সাধারণ ভাষায় যেমন একটি ... সন্দেহ ... প্রকাশ করেন। যথা, এটি যে পরামিতিগুলি পাস করতে হয়েছে, 0 হতে পারে, 1 হতে পারে আরও 1 (অ্যারে) হতে পারে তা পরিষ্কার নয় ...


1

String... হিসাবে একই String[]

import java.lang.*;

public class MyClassTest {

    //public static void main(String... args) { 

    public static void main(String[] args) {
        for(String str: args) {
            System.out.println(str);
        }
    }
}

1
যদি String...একই হয় তবে String[]আপনি কি কেবল এটি বলতে পারছেন না?
স্কট হান্টার

8
প্রযুক্তিগতভাবে সত্য নয় কারণ String[]আর্গুমেন্টের প্রয়োজন (কমপক্ষে একটি খালি অ্যারে) যেখানে String...নেই (উপরের উত্তরটি দেখুন)।
অরেল

0

অন্যান্য ভাল-লিখিত উত্তরের সাথে যুক্ত করার সাথে সাথে varagrsআমার একটি সুবিধাটি দরকারী বলে মনে হয়েছিল তা হল, আমি যখন অ্যারে যুক্ত কোনও প্যারামিটারের ধরণ হিসাবে কল করি তখন এটি অ্যারে তৈরির ব্যথা দূর করে; উপাদান যুক্ত করুন এবং তারপরে এটি প্রেরণ করুন। পরিবর্তে, আমি যতটা মান চাই পদ্ধতিতে কেবল কল করতে পারি; শূন্য থেকে অনেকের কাছে।


0
  • এর অর্থ শূন্য বা একই ডাটা টাইপের একাধিক প্যারামিটার।
  • এটি অবশ্যই নির্মাণকারী বা ফাংশনের শেষ প্যারামিটার হতে হবে।
  • আমরা সংশ্লিষ্ট কন্সট্রাক্টর বা ফাংশনে এই ধরণের একটি মাত্র প্যারামিটার রাখতে পারি।

উদাহরণ 1:

public class quest1 {

    public quest1(String... mynum) {
        System.out.println("yee haa");
    }

    public static void main(String[] args) {
        quest1 q=new quest1();

        quest1 q1=new quest1("hello");

    }
}

উদাহরণ 2:

public class quest1 {

    public quest1(int... at) {
        System.out.println("yee haa");
    }

    public quest1(String... at) {
        System.out.println("yee haa");
    }

    public static void main(String[] args) {
        quest1 q=new quest1("value");

        quest1 q1=new quest1(1);

    }

    public void name(String ... s) {

    }
}

আউটপুট:

ইয়ে হা

ইয়ে হা


-1

সিনট্যাক্স: (ট্রিপল ডট ...) -> এর অর্থ আমরা শূন্য বা আরও বেশি বস্তু যুক্তির মাধ্যমে পাস করতে পারি বা টাইপের অবজেক্টের অ্যারে পাস করতে পারি।

public static void main(String[] args){}
public static void main(String... args){}

সংজ্ঞা: 1) অবজেক্ট ... আর্গুমেন্ট কেবলমাত্র অবজেক্টগুলির একটি অ্যারের রেফারেন্স।

2) ('স্ট্রিং []' বা স্ট্রিং ...) এটি যে কোনও সংখ্যক স্ট্রিং অবজেক্ট পরিচালনা করতে সক্ষম to অভ্যন্তরীণভাবে এটি রেফারেন্স টাইপ অবজেক্টের একটি অ্যারে ব্যবহার করে।

i.e. Suppose we pass an Object array to the ... argument - will the resultant argument value be a two-dimensional array - because an Object[] is itself an Object:

3) আপনি যদি একক যুক্তি দিয়ে পদ্ধতিটি কল করতে চান এবং এটি অ্যারে হিসাবে ঘটে থাকে তবে আপনাকে স্পষ্টভাবে এটিকে মোড়তে হবে

another. method(new Object[]{array}); 
OR 
method((Object)array), which will auto-wrap.

অ্যাপ্লিকেশন: আর্গুমেন্টগুলির সংখ্যা গতিশীল হলে (রানটাইমটিতে আর্গুমেন্টের সংখ্যা জেনে থাকে) এবং ওভাররাইডে এটি প্রধানত ব্যবহৃত হয়। সাধারণ নিয়ম - পদ্ধতিতে আমরা যে কোনও ধরণের এবং যে কোনও সংখ্যক আর্গুমেন্ট পাস করতে পারি। আমরা কোনও নির্দিষ্ট যুক্তির আগে অবজেক্ট (...) যুক্তি যুক্ত করতে পারি না can অর্থাত

void m1(String ..., String s) this is a wrong approach give syntax error.
void m1(String s, String ...); This is a right approach. Must always give last order prefernces.   
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.