জাভাতে 'অ্যারেলিস্ট <স্ট্রিং>' স্ট্রিং [] 'তে রূপান্তর করা


1022

আমি কীভাবে কোনও জাভাকে ArrayList<String>কোনও String[]অ্যারে রূপান্তর করতে পারি ?


2
আছে এই উত্তর তৈরি সঙ্গে একটি আপডেট পদ্ধতির JDK -11 এর কাছে নতুন সমান performant এপিআই উপস্থাপক toArray(T[])এবং বাক্য গঠন অনুরূপ Stream.toArray
নমন

উত্তর:


1787
List<String> list = ..;
String[] array = list.toArray(new String[0]);

উদাহরণ স্বরূপ:

List<String> list = new ArrayList<String>();
//add some stuff
list.add("android");
list.add("apple");
String[] stringArray = list.toArray(new String[0]);

toArray()কোনো আর্গুমেন্ট আয় ক্ষণস্থায়ী ছাড়া পদ্ধতি Object[]। সুতরাং আপনাকে আর্গুমেন্ট হিসাবে একটি অ্যারে পাস করতে হবে, যা তালিকা থেকে ডেটা দিয়ে পূর্ণ হবে এবং ফিরে আসবে। আপনি খালি অ্যারে পাশাপাশি পাস করতে পারেন, তবে আপনি পছন্দসই আকারের সাথে একটি অ্যারেও পাস করতে পারেন।

গুরুত্বপূর্ণ আপডেট : মূলত উপরের কোডটি ব্যবহার করা হয়েছে new String[list.size()]। তবে এই ব্লগপোস্টটি প্রকাশ করে যে জেভিএম অপ্টিমাইজেশনের কারণে new String[0]এখন ব্যবহার করা আরও ভাল।


16
আর্গুমেন্টের আকারটি কি কোনও পার্থক্য করে?
থরবজর্ন রাভন অ্যান্ডারসন

37
এটি আরও একটি অ্যারে ইনস্ট্যান্টেশনকে বাঁচায়
বোজহো

59
দেখা যাচ্ছে যে শূন্য-দৈর্ঘ্যের অ্যারে সরবরাহ করা, এমনকি এটি তৈরি করে ফেলে দেওয়াও সঠিক আকারের অ্যারে বরাদ্দকরণের তুলনায় গড়ে দ্রুত। Benchmarks এবং ব্যাখ্যার জন্য এখানে দেখুন: shipilev.net/blog/2016/arrays-wisdom-ancients
স্টুয়ার্ট মার্কস

2
(দুঃখিত। অলংকারিক প্রশ্ন। উত্তরটি অবশ্যই, কারণ জাভা আসল জেনেরিকগুলি করে না; এটি বেশিরভাগই কেবল
অবজেক্টটি ফেলে দিয়ে

2
@lyuboslavkanev সমস্যাটি হ'ল জাভাতে জেনেরিক টাইপ থাকা আসলে সেই ধরণের উপর ভিত্তি করে অবজেক্ট তৈরি করার পক্ষে যথেষ্ট নয়; এমনকি একটি অ্যারেও নয় (যা হাস্যকর, কারণ এটি কোনও প্রকারের জন্য কাজ করা উচিত )। এটি দিয়ে যা করা যায় তার সবই কাস্টিং হয়। প্রকৃতপক্ষে, এমনকি এ ধরণের অবজেক্ট তৈরি করতে আপনার আসল Classঅবজেক্ট থাকা দরকার যা জেনেরিক ধরণের থেকে পাওয়া সম্পূর্ণ অসম্ভব বলে মনে হয়। এর কারণ, যেমনটি আমি বলেছিলাম, পুরো নির্মাণটি নকল; এটি সমস্ত অভ্যন্তরীণভাবে কেবল অবজেক্ট হিসাবে সঞ্চিত।
নাইয়ারগডস

170

জাভা 8 এর একটি বিকল্প:

String[] strings = list.stream().toArray(String[]::new);

জাভা 11+:

String[] strings = list.toArray(String[]::new);

25
নাকি কোনও সুবিধা?
জেমস ওয়াটকিন্স

1
আমি সেই বাক্য গঠনটি পছন্দ করতে চাই, তবে ইন্টেলিজি এটির সাথে একটি সংকলক ত্রুটি প্রদর্শন করে, অভিযোগ করে "টি [] একটি কার্যকরী ইন্টারফেস নয়" "
গ্লেন মাযজা

3
@ GlenMazza- কে আপনি কেবল toArrayএকটি Streamঅবজেক্টে ব্যবহার করতে পারেন । এই সংকলন ত্রুটি ঘটতে পারে যদি আপনি একটি ব্যবহার করে স্ট্রিমটি হ্রাস করেন Collectorsএবং তারপরে প্রয়োগ করার চেষ্টা করেন toArray
উদারা বেনোটা

39

আপনি এর toArray()জন্য পদ্ধতিটি ব্যবহার করতে পারেন List:

ArrayList<String> list = new ArrayList<String>();

list.add("apple");
list.add("banana");

String[] array = list.toArray(new String[list.size()]);

অথবা আপনি ম্যানুয়ালি একটি অ্যারেতে উপাদানগুলি যুক্ত করতে পারেন:

ArrayList<String> list = new ArrayList<String>();

list.add("apple");
list.add("banana");

String[] array = new String[list.size()];

for (int i = 0; i < list.size(); i++) {
    array[i] = list.get(i);
}

আশাকরি এটা সাহায্য করবে!


30
ArrayList<String> arrayList = new ArrayList<String>();
Object[] objectList = arrayList.toArray();
String[] stringArray =  Arrays.copyOf(objectList,objectList.length,String[].class);

কপিরআফ, অ্যারেলিস্ট ব্যবহার করে অ্যারেতেও করা যেতে পারে।


4
"অবজেক্টলিস্ট = ..." এবং "স্ট্রিংআরে" কে ক্যামেলকেস পরামর্শ দিন। এছাড়াও, এটি অ্যারেসকপিওফ ... রাজধানী ও।
জেসন বিডেন

1
list.toArray () অভ্যন্তরীণভাবে অ্যারেসকপি ব্যবহার করে ()
ডেভিড

25

জাভা -11 থেকে শুরু করে, বিকল্প Collection.toArray(IntFunction<T[]> generator)হিসাবে একইটি অর্জনের জন্য API টি ব্যবহার করতে পারেন :

List<String> list = List.of("x","y","z");
String[] arrayBeforeJDK11 = list.toArray(new String[0]);
String[] arrayAfterJDK11 = list.toArray(String[]::new); // similar to Stream.toArray

10

জাভা 8 তে:

String[] strings = list.parallelStream().toArray(String[]::new);

12
এটি ইতিমধ্যে এই উত্তরে অন্তর্ভুক্ত রয়েছে । সম্পূর্ণ এটিকে উত্তর হিসাবে পরিবর্তে সম্ভবত এটি উত্তরে এটিকে যুক্ত করুন।
নদী

11
এর parallelStream()পরিবর্তে সরল কেন stream()?
ইয়ুরি এন।

7

জাভা 8 এ এটি ব্যবহার করে করা যেতে পারে

String[] arrayFromList = fromlist.stream().toArray(String[]::new);

6

জেনারিকস সমাধানটি যেকোনকে গোপন List<Type>করতে String []:

public static  <T> String[] listToArray(List<T> list) {
    String [] array = new String[list.size()];
    for (int i = 0; i < array.length; i++)
        array[i] = list.get(i).toString();
    return array;
}

নোট আপনি অবশ্যই override toString()পদ্ধতি।

class Car {
  private String name;
  public Car(String name) {
    this.name = name;
  }
  public String toString() {
    return name;
  }
}
final List<Car> carList = new ArrayList<Car>();
carList.add(new Car("BMW"))
carList.add(new Car("Mercedes"))
carList.add(new Car("Skoda"))
final String[] carArray = listToArray(carList);

5
List <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list){
  array[i++] = s;
}

13
এটি কাজ করে, তবে অত্যন্ত দক্ষ নয় এবং অতিরিক্ত কোড সহ স্বীকৃত উত্তরে কার্যকারিতা ডুপ্লিকেট করে।
অ্যালান ডেলিমন

5

যদি ডেটাটির অতিরিক্ত কিছু হেরফের পছন্দসই হয়, যার জন্য ব্যবহারকারী কোনও ফাংশন চান, এই পদ্ধতিটি সঠিক নয় (কারণ এটি উপাদানটির দ্বিতীয় প্যারামিটার হিসাবে শ্রেণিটি পাস করার প্রয়োজন), তবে কাজ করে:

আমদানি java.util.ArrayList; আমদানি করুন java.lang.reflect.Array;

public class Test {
  public static void main(String[] args) {
    ArrayList<Integer> al = new ArrayList<>();
    al.add(1);
    al.add(2);
    Integer[] arr = convert(al, Integer.class);
    for (int i=0; i<arr.length; i++)
      System.out.println(arr[i]);
  }

  public static <T> T[] convert(ArrayList<T> al, Class clazz) {
    return (T[]) al.toArray((T[])Array.newInstance(clazz, al.size()));
  }
}

5

যদি আপনার অ্যাপ্লিকেশনটি ইতিমধ্যে অ্যাপাচি কমন্স লাইব ব্যবহার করে থাকে তবে প্রতিবার নতুন খালি অ্যারে তৈরি না করার জন্য আপনি স্বীকৃত উত্তরটি কিছুটা সংশোধন করতে পারেন:

List<String> list = ..;
String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);

// or if using static import
String[] array = list.toArray(EMPTY_STRING_ARRAY);

বিভিন্ন ধরণের আরও কয়েকটি পূর্বপলিত খালি অ্যারে রয়েছে ArrayUtils

এছাড়াও আমরা আমাদের জন্য এইভাবে খালি অ্যারে তৈরি করতে জেভিএমকে কৌশল করতে পারি:

String[] array = list.toArray(ArrayUtils.toArray());

// or if using static import
String[] array = list.toArray(toArray());

তবে সত্যিই কোনও উপকার নেই, কেবল স্বাদের বিষয়, আইএমও।


5

আপনি Iterator<String>উপাদানগুলির পুনরাবৃত্তি করতে ব্যবহার করতে পারেন ArrayList<String>:

ArrayList<String> list = new ArrayList<>();
String[] array = new String[list.size()];
int i = 0;
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); i++) {
    array[i] = iterator.next();
}

এখন আপনি যে String[]কোনও লুপ ব্যবহার করে উপাদানগুলি পুনরুদ্ধার করতে পারেন ।


আমি হ্রাস পেয়েছি কারণ: 1. জেনেরিকের কোনও ব্যবহার যা আপনাকে 2 এ জোর করে .toString()where যেখানে কোনও সুস্পষ্ট কাস্টের প্রয়োজন হবে না তা ব্যবহার করে , 3. আপনি এমনকি বর্ধনও করেন না i, এবং ৪। এ whileদ্বারা প্রতিস্থাপন করা আরও ভাল হবে for। প্রস্তাবিত কোড:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
অলিভিয়ার গ্রাগোয়ার

ঠিক আছে, আমি এখন এটি পেয়েছিলাম। ধন্যবাদ।
ভাতসাল চাভদা

ভাল, আদর্শভাবে, আপনার মন্তব্যগুলিকে অন্তর্ভুক্ত করার জন্য আপনার কোডটি সম্পাদনা করা উচিত (এটি যদি আপনি মনে করেন যে তারা আপনার উত্তরের জন্য ভাল!)। কোডটি অপরিবর্তিত থাকাকালীন আমি আমার ডাউনটোট সরানোর বিষয়ে বিবেচনা করব না।
অলিভিয়ার

আমি এখানে নতুন, তাই জিনিসগুলি এখানে কীভাবে কাজ করে তা এখনও জানি না। যদিও, আপনার সহায়তা সাথির প্রশংসা করুন।
ভাতসাল চাভদা

এটি আরও ভাল! আমি মাত্র কিছুটা সম্পাদনা করেছি, তবে আপনি কীভাবে এটি কাজ করে তা ঠিক অভিজ্ঞতা অর্জন করেছেন: উত্তর সরবরাহ করুন, তাদের উন্নতি করুন, খ্যাতি অর্জন করুন;)
অলিভিয়ার গ্রাগোয়ার

5

জাভা 11 এ, আমরা Collection.toArray(generator)পদ্ধতিটি ব্যবহার করতে পারি । নিম্নলিখিত কোডটি স্ট্রিংয়ের একটি নতুন অ্যারে তৈরি করবে:

List<String> list = List.of("one", "two", "three");
String[] array = list.toArray(String[]::new)

java.base এর java.util.Collection.toArray() থেকে ।


4
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    String [] strArry= list.stream().toArray(size -> new String[size]);

প্রতি মন্তব্যে, রূপান্তর কীভাবে কাজ করে তা ব্যাখ্যা করার জন্য আমি একটি অনুচ্ছেদ যুক্ত করেছি। প্রথমে তালিকাটি স্ট্রিং স্ট্রিমে রূপান্তরিত হয়। তারপরে এটি স্ট্রিমের উপাদানগুলিকে একটি অ্যারেতে রূপান্তর করতে Stream.toArray ব্যবহার করে। উপরের শেষ বিবৃতিতে "আকার -> নতুন স্ট্রিং [আকার]" আসলে একটি ইন্টারফানশন ফাংশন যা স্ট্রিং স্ট্রিমের আকারের সাথে একটি স্ট্রিং অ্যারে বরাদ্দ করে। বিবৃতিটি অভিন্ন

IntFunction<String []> allocateFunc = size -> { 
return new String[size];
};   
String [] strArry= list.stream().toArray(allocateFunc);

4
এই উত্তরটি কোন মূল্য যুক্ত করে? এটি কেন প্রশ্নের উত্তর দেয় তা ব্যাখ্যা না করে কেবল অন্য উত্তরগুলির পুনরাবৃত্তি বলে মনে হয়।
রিচার্ড

2

আপনি এই পদ্ধতিটি ব্যবহার করে তালিকাটিকে স্ট্রিং অ্যারে রূপান্তর করতে পারেন:

 Object[] stringlist=list.toArray();

সম্পূর্ণ উদাহরণ:

ArrayList<String> list=new ArrayList<>();
    list.add("Abc");
    list.add("xyz");

    Object[] stringlist=list.toArray();

    for(int i = 0; i < stringlist.length ; i++)
    {
          Log.wtf("list data:",(String)stringlist[i]);
    }

1
private String[] prepareDeliveryArray(List<DeliveryServiceModel> deliveryServices) {
    String[] delivery = new String[deliveryServices.size()];
    for (int i = 0; i < deliveryServices.size(); i++) {
        delivery[i] = deliveryServices.get(i).getName();
    }
    return delivery;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.