অ্যারে জাভায় তালিকায় রূপান্তর করা হচ্ছে


1027

আমি জাভাতে একটি অ্যারে কীভাবে একটি তালিকায় রূপান্তর করব?

আমি ব্যবহার করেছি Arrays.asList()তবে আচরণটি (এবং স্বাক্ষর) একরকম জাভা এসই 1.4.2 থেকে (ডকুমেন্ট এখন সংরক্ষণাগারটিতে) থেকে 8 এ পরিবর্তিত হয়েছে এবং ওয়েবে আমি যে স্নিপেটগুলি পেয়েছি সেগুলি 1.4.2 ব্যবহার ব্যবহার করে।

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

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
  • 1.4.2 এ 1, 2, 3 উপাদানগুলি সমেত একটি তালিকা প্রদান করে
  • 1.5.0+ এ অ্যারে স্প্যামযুক্ত একটি তালিকা দেয়

অনেক ক্ষেত্রে এটি সনাক্ত করা সহজ হওয়া উচিত, তবে কখনও কখনও এটি অলক্ষিতভাবে পিছলে যেতে পারে:

Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);

20
আমি মনে করি আপনার উদাহরণ নষ্ট হয়ে গেছে: Arrays.asList(new int[] { 1, 2, 3 }); স্পষ্টভাবে জাভা 1.4.2 মধ্যে কম্পাইল করা হয়নি, কারন একটি int[]হল না একটি Object[]
জোয়াচিম সৌর

1
ওহ, আপনি ঠিক থাকতে পারে। পোস্ট করার আগে আমার উদাহরণ পরীক্ষা করার জন্য আমার কাছে জাভা 1.4.2 সংকলক নেই। এখন, আপনার মন্তব্য এবং জো এর উত্তর দেওয়ার পরে, সবকিছু আরও বেশি অর্থবোধ করে।
আলেকজান্দ্রু

1
আমি ভেবেছিলাম অটোবক্সিংয়ের আদিম থেকে মোড়কের পূর্ণাঙ্গ শ্রেণিতে রূপান্তর হবে have আপনি প্রথমে নিজেকে কাস্ট করতে পারেন এবং তারপরে উপরের Arrays.asListকোডটির কাজ করা উচিত।
ঘোড়া ভয়েস

2
জাভা 8 এর স্ট্রিম.বক্সেড () অটোবক্সিংয়ের যত্ন নেবে এবং এর জন্য ব্যবহার করা যেতে পারে। আমার উত্তর নীচে দেখুন
ইব্রাহিম সংক্ষিপ্তসার

জাভা 8 সমাধান: stackoverflow.com/questions/2607289/...
akhil_mittal

উত্তর:


1430

আপনার উদাহরণে, এটি কারণ আপনার কাছে কোনও আদিম ধরণের তালিকা থাকতে পারে না। অন্য কথায়, List<int>সম্ভব নয়।

তবে, আপনি ক্লাসটি List<Integer>ব্যবহার করে Integerআদিমকে আবৃত করতে পারেন int। একটি আপনার অ্যারের রূপান্তর Listসঙ্গে Arrays.asListউপযোগ পদ্ধতি।

Integer[] spam = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(spam);

IdeOne.com এ এই কোডটি সরাসরি চালিত দেখুন ।


112
বা এমনকি আরও সহজ: অ্যারে.এএসলিস্ট (1, 2, 3);
কং

45
এটি কীভাবে তৈরি করা যায় না List<Integer[]>?
টমাস আহলে 22

25
জাভা 5+ এ ব্যর্থ।
djechlin

5
@ থমাসহলে এটি একটি তালিকা তৈরি করে না <পূর্ণসংখ্যক []> এটি একটি তালিকা তৈরি করে <অন্তর্গত> বস্তু। এবং আপনি যদি টাইপ নিরাপদ হতে চান তবে আপনি লিখতে পারেন: অ্যারে I
ব্যবহারকারী 1712376

6
@ থমাস অহলে এটি একটি ভাল প্রশ্ন। একটি ধারণা এটি জাভা সংকলকটিতে কেবল একটি নিয়ম। উদাহরণস্বরূপ নীচের কোডটি << পূর্ণসংখ্যা []>Integer[] integerArray1 = { 1 }; Integer[] integerArray2 = { 2 }; List<Integer[]> integerArrays = Arrays.asList(integerArray1, integerArray2);
সাইমন

167

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

int[] spam = new int[] { 1, 2, 3 };
Arrays.stream(spam)
      .boxed()
      .collect(Collectors.toList());

এটি দুর্দান্ত, তবে এটি কার্যকর হবে না boolean[]। আমার ধারণা এটি কারণ এটি সহজেই তৈরি করা সহজ Boolean[]। এটি সম্ভবত একটি ভাল সমাধান। যাইহোক, এটি একটি আকর্ষণীয় দৌড়ঝাঁপ।
গ্লেনপিটারসন

138

রূপান্তর উপায় সম্পর্কে বলতে গিয়ে, আপনার কেন আপনার প্রয়োজন তা নির্ভর করে List। আপনার যদি প্রয়োজন হয় এটি কেবল ডেটা পড়তে হবে। ঠিক আছে, আপনি এখানে যান:

Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);

তবে আপনি যদি এরকম কিছু করেন:

list.add(1);

আপনি পেতে java.lang.UnsupportedOperationException। সুতরাং কিছু কিছু ক্ষেত্রে এমনকি আপনার এটি প্রয়োজন:

Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));

প্রথম পদ্ধতির আসলে অ্যারে রূপান্তরিত হয় না তবে এটি 'র মতো' উপস্থাপন করে List। তবে অ্যারের স্থির সংখ্যক উপাদানের মতো সমস্ত বৈশিষ্ট্য সহ হুডের নিচে। দয়া করে নোট করুন আপনি নির্মাণের সময় টাইপ নির্দিষ্ট করা প্রয়োজন ArrayList


1
"অপরিবর্তনীয়তা" আমাকে এক মুহুর্তের জন্য বিভ্রান্ত করেছিল। আপনি অবশ্যই অ্যারের মানগুলি পরিবর্তন করতে পারবেন। তবে আপনি এর আকার পরিবর্তন করতে পারবেন না।
টিম পোহলমান

125

সমস্যাটি হ'ল ভারাজগুলি জাভা 5 এ প্রবর্তিত হয়েছিল এবং দুর্ভাগ্যক্রমে, Arrays.asList()ভারার ভার্সনটিও ওভারলোড হয়ে গেছে। সুতরাং Arrays.asList(spam)জাভা 5 সংকলক দ্বারা ইনট অ্যারেগুলির একটি ভারাক পরামিতি হিসাবে বোঝা যাচ্ছে।

এই সমস্যাটি কার্যকর জাভা 2 য় সংস্করণে, অধ্যায় 7, আইটেম 42 এ আরও বিশদে ব্যাখ্যা করা হয়েছে।


4
আমি বুঝতে পেরেছি কি হয়েছিল, তবে কেন এটি নথিভুক্ত করা হয়নি। আমি চাকাটি পুনরায় সংশোধন না করে বিকল্প সমাধানের সন্ধান করছি।
আলেকজান্দ্রু

2
@UsmanIsmail জাভা 8-র হিসাবে, আমরা এই রূপান্তরটির জন্য স্ট্রিম ব্যবহার করতে পারি। আমার উত্তর নীচে দেখুন
ইব্রাহিম সংক্ষিপ্তসার

109

মনে হচ্ছে একটু দেরি হলেও এখানে আমার দুটি সেন্ট। আমরা আদিম ধরণের List<int>হিসাবে থাকতে পারি না intতাই আমরা কেবল তা পারি List<Integer>

জাভা 8 (int অ্যারে)

int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList()); 

জাভা 8 এবং নীচে (পূর্ণসংখ্যার অ্যারে)

Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 =  Arrays.asList(integers); // returns a fixed-size list backed by the specified array.
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only

অ্যারেলিস্ট প্রয়োজন এবং তালিকা নয়?

যদি আমরা Listউদাহরণস্বরূপ একটি নির্দিষ্ট বাস্তবায়ন চাই ArrayListতবে আমরা এটি toCollectionহিসাবে ব্যবহার করতে পারি :

ArrayList<Integer> list24 = Arrays.stream(integers)
                          .collect(Collectors.toCollection(ArrayList::new));

list21কাঠামোগতভাবে সংশোধন করা যাবে না কেন ?

যখন আমরা ব্যবহার করি Arrays.asListপ্রত্যাবর্তিত তালিকার আকার ঠিক করা হয় কারণ প্রত্যাবর্তিত তালিকাটি নয় java.util.ArrayList, তবে একটি প্রাইভেট স্ট্যাটিক শ্রেণীর ভিতরে সংজ্ঞায়িত করা হয়েছে java.util.Arrays। সুতরাং আমরা যদি ফেরত তালিকা থেকে উপাদানগুলি যুক্ত বা সরিয়ে ফেলি, তবে একটি UnsupportedOperationExceptionনিক্ষেপ করা হবে। সুতরাং আমরা list22যখন তালিকাটি পরিবর্তন করতে চাই তখন আমাদের সাথে যাওয়া উচিত । আমাদের জাভা 8 থাকলে আমরাও সাথে যেতে পারি list23

স্পষ্ট list21হওয়ার জন্য এই অর্থে সংশোধন করা যেতে পারে যে আমরা কল করতে পারি list21.set(index,element)তবে এই তালিকাটি কাঠামোগতভাবে সংশোধন করা যাবে না অর্থাৎ তালিকা থেকে উপাদানগুলি যুক্ত করতে বা অপসারণ করতে পারে না। আপনি এই প্রশ্নটি পরীক্ষা করতে পারেন ।


যদি আমরা একটি অপরিবর্তনীয় তালিকা চাই তবে আমরা এটিকে এটিকে মোড়ানো করতে পারি:

List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));

আরেকটি বিষয় লক্ষণীয় হ'ল পদ্ধতিটি Collections.unmodifiableListনির্দিষ্ট তালিকার একটি অবিশ্বাস্য দৃশ্য প্রদর্শন করে। একটি অপরিবর্তনীয় দৃশ্যের সংগ্রহ হ'ল এমন একটি সংগ্রহ যা অনিবার্যযোগ্য নয় এবং এটি একটি ব্যাকিং সংগ্রহের মধ্যেও একটি দৃশ্য। নোট করুন যে ব্যাকিং সংগ্রহে পরিবর্তনগুলি এখনও সম্ভব হতে পারে এবং যদি এটি ঘটে থাকে তবে তারা অবিস্মরণীয় দৃশ্যের মাধ্যমে দৃশ্যমান।

জাভা 9 এবং 10 এ আমাদের একটি সত্যিকারের অপরিবর্তনীয় তালিকা থাকতে পারে।

সত্যিই অপরিবর্তনীয় তালিকা

জাভা 9:

String[] objects = {"Apple", "Ball", "Cat"};
List<String> objectList = List.of(objects);

জাভা 10 (সত্যই অপ্রয়োজনীয় তালিকা) দুটি উপায়ে:

  1. List.copyOf(Arrays.asList(integers))
  2. Arrays.stream(integers).collect(Collectors.toUnmodifiableList());

আরও আমার জন্য এই উত্তর পরীক্ষা করে দেখুন।


@ বাসিলবৌরক আমি বোঝাতে চাইছি সংযোজন / মোছার দ্বারা তালিকার কাঠামো পরিবর্তন করতে পারে না তবে উপাদানগুলি পরিবর্তন করতে পারে।
akhil_mittal

প্রকৃতপক্ষে, আমি কিছু কোড চেষ্টা করেছি এবং নিশ্চিত করেছি যে কলিং List::addএবং List::removeফিরে আসা একটি তালিকাতে ব্যর্থ Arrays.asList। এই পদ্ধতির জাভাডোকটি এই বিষয়টিতে খারাপভাবে লেখা এবং অস্পষ্ট। আমার তৃতীয় পাঠের সময়, আমি মনে করি যে "স্থির আকার" শব্দটিটি বলতে চাইছিল যে কেউ উপাদান যুক্ত করতে বা মুছে ফেলতে পারে না।
বাসিল বাউরুক 3:38


11

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

শেষ অবধি, আমাকে একটি "ম্যানুয়াল" রূপান্তর করতে হয়েছিল:

    List<ListItem> items = new ArrayList<ListItem>();
    for (ListItem item: itemsArray) {
        items.add(item);
    }

আমি মনে করি আমি একটি অ্যারে থেকে তালিকা.এডএডএল (আইটেম) অপারেশনটি ব্যবহার করে কোনও তালিকায় রূপান্তর যুক্ত করতে পারতাম।


11
new ArrayList<ListItem>(Arrays.asList(itemsArray))একই হবে
মার্কো 13

1
@ ব্র্যাডিঝু: অনুমোদিত উত্তরটি স্থির আকারের অ্যারে দিয়ে আমার সমস্যা সমাধান করে না তবে আপনি মূলত এখানে আরটিএফএম বলছেন যা সর্বদা খারাপ রূপ। উত্তরটির সাথে কী ভুল তা ব্যাখ্যা করুন বা মন্তব্য করতে বিরক্ত করবেন না।
স্টিভ গেলম্যান

2
পরিদর্শন সরঞ্জামগুলি এখানে একটি সতর্কতা দেখাতে পারে এবং আপনি কারণটির নাম দিয়েছেন। উপাদানগুলি ম্যানুয়ালি অনুলিপি করার দরকার নেই, Collections.addAll(items, itemsArray)পরিবর্তে ব্যবহার করুন।
দারেক কে

শুধু এই ব্যতিক্রম আঘাত। আমি ভয় করি মার্কো 13 এর উত্তরটি সঠিক উত্তর হওয়া উচিত। সমস্ত "asList" ব্যতিক্রম ঠিক করতে আমার পুরো বছর কোডটি যেতে হবে।

7

অ্যারে ব্যবহার করা

এটি অ্যারে রূপান্তর করার সহজতম উপায় List। তবে, আপনি যদি কোনও নতুন উপাদান যুক্ত করার চেষ্টা করেন বা তালিকা থেকে কোনও বিদ্যমান উপাদান সরিয়ে ফেলেন তবে একটি UnsupportedOperationExceptionনিক্ষেপ করা হবে।

Integer[] existingArray = {1, 2, 3};
List<Integer> list1 = Arrays.asList(existingArray);
List<Integer> list2 = Arrays.asList(1, 2, 3);

// WARNING:
list2.add(1);     // Unsupported operation!
list2.remove(1);  // Unsupported operation!

অ্যারেলিস্ট বা অন্যান্য তালিকা বাস্তবায়ন ব্যবহার করে

আপনি প্রয়োগের সাথে forঅ্যারের সমস্ত উপাদান যুক্ত করতে একটি লুপ ব্যবহার করতে পারেন List, যেমন ArrayList:

List<Integer> list = new ArrayList<>();
for (int i : new int[]{1, 2, 3}) {
  list.add(i);
}

জাভা 8 এ স্ট্রিম এপিআই ব্যবহার করে

আপনি অ্যারেটিকে স্ট্রীমে পরিণত করতে পারেন, তারপরে বিভিন্ন সংগ্রাহক ব্যবহার করে স্ট্রিমটি সংগ্রহ করুন: জাভা 8-এ ডিফল্ট সংগ্রাহক ArrayListস্ক্রিনের পিছনে ব্যবহার করেন তবে আপনি নিজের পছন্দসই প্রয়োগটি আরোপ করতে পারেন।

List<Integer> list1, list2, list3;
list1 = Stream.of(1, 2, 3).collect(Collectors.toList());
list2 = Stream.of(1, 2, 3).collect(Collectors.toCollection(ArrayList::new));
list3 = Stream.of(1, 2, 3).collect(Collectors.toCollection(LinkedList::new));

আরো দেখুন:



5

আপনাকে অ্যারেতে কাস্ট করতে হবে

Arrays.asList((Object[]) array)

3
java: বেমানান ধরণের: int [] java.lang এ রূপান্তর করা যায় না
b অবজেক্ট

@dVaffection এরপরে int- তে কাস্ট করুন []। গুরুত্বপূর্ণ অংশটি একটি অ্যারেতে কাস্ট করা।
নেব্রিল


5

জাভা 9 এ আপনার নতুন সুবিধাগুলি কারখানার পদ্ধতির মাধ্যমে অপরিবর্তনীয় তালিকা ব্যবহারের আরও দুর্দান্ত সমাধান রয়েছে List.of:

List<String> immutableList = List.of("one","two","three");

(নির্লজ্জভাবে এখান থেকে অনুলিপি করা )


এফওয়াইআই, এর পিছনে কিছু প্রযুক্তিগত বিশদ জানতে, জেপ 269 দেখুন: সংগ্রহের সুবিধার্থে কারখানার পদ্ধতি এবং প্রধান লেখক স্টুয়ার্ট মার্কসের একটি বক্তৃতা
তুলসী বাউরক

5

আপনি যদি জাভা 8 (বা তারপরে) লক্ষ্য করে থাকেন তবে আপনি এটি চেষ্টা করতে পারেন:

int[] numbers = new int[] {1, 2, 3, 4};
List<Integer> integers = Arrays.stream(numbers)
                        .boxed().collect(Collectors.<Integer>toList());

বিঃদ্রঃ:

দিতে মনোযোগ Collectors.<Integer>toList(), এই জেনেরিক পদ্ধতি আপনি ত্রুটি "প্রকার মেলেনি থেকে রূপান্তর করতে পারবে না এড়াতে সাহায্য করে List<Object>থেকে List<Integer>"।


4
  1. পেয়ারা ব্যবহার:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = Lists.newArrayList(sourceArray);
  2. অ্যাপাচি কমন্স সংগ্রহগুলি ব্যবহার করে:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = new ArrayList<>(6);
    CollectionUtils.addAll(list, array);

3

যদি এটি সহায়তা করে: আমার একই সমস্যা ছিল এবং কেবল একটি জেনেরিক ফাংশন লিখেছিলাম যা একটি অ্যারে নেয় এবং একই বিষয়বস্তু সহ একই ধরণের একটি অ্যারেলিস্ট প্রদান করে:

public static <T> ArrayList<T> ArrayToArrayList(T[] array) {
    ArrayList<T> list = new ArrayList<T>();
    for(T elmt : array) list.add(elmt);
    return list;
}

যদি এটি সাহায্য না করে? তাহলে আপনি কি করলেন ?? ... জে কে :)
সাউ অনᴇᴌᴀ

2

প্রদত্ত অ্যারে:

    int[] givenArray = {2,2,3,3,4,5};

পূর্ণসংখ্যা অ্যারেটিকে পূর্ণসংখ্যার তালিকায় রূপান্তর করা

একটি উপায়: বাক্সযুক্ত () -> ইন্টারস্ট্রিম প্রদান করে

    List<Integer> givenIntArray1 = Arrays.stream(givenArray)
                                  .boxed()
                                  .collect(Collectors.toList());

দ্বিতীয় উপায়: প্রবাহের প্রতিটি উপাদানকে পূর্ণসংখ্যার মানচিত্র করুন এবং তারপরে সংগ্রহ করুন

দ্রষ্টব্য: মানচিত্রটোবজ ব্যবহার করে আপনি প্রতিটি ইনট উপাদানকে স্ট্রিং স্ট্রিম, চর স্ট্রিম ইত্যাদিতে আই-কে (চর) কেস করে গুপ্ত করতে পারেন I

    List<Integer> givenIntArray2 = Arrays.stream(givenArray)
                                         .mapToObj(i->i)
                                         .collect(Collectors.toList());

একটি অ্যারের প্রকারকে অন্য প্রকারে রূপান্তর করা উদাহরণ:

List<Character> givenIntArray2 = Arrays.stream(givenArray)
                                             .mapToObj(i->(char)i)
                                             .collect(Collectors.toList());

1

সুতরাং আপনি কোন জাভা সংস্করণটি চেষ্টা করছেন তার উপর নির্ভর করে-

জাভা 7

 Arrays.asList(1, 2, 3);

অথবা

       final String arr[] = new String[] { "G", "E", "E", "K" };
       final List<String> initialList = new ArrayList<String>() {{
           add("C");
           add("O");
           add("D");
           add("I");
           add("N");
       }};

       // Elements of the array are appended at the end
       Collections.addAll(initialList, arr);

অথবা

Integer[] arr = new Integer[] { 1, 2, 3 };
Arrays.asList(arr);

জাভা 8 এ

int[] num = new int[] {1, 2, 3};
List<Integer> list = Arrays.stream(num)
                        .boxed().collect(Collectors.<Integer>toList())

তথ্যসূত্র - http://www.codingeek.com/java/how-to-convert-array-to-list-in-java/


1

আপনি কি এই উত্তরটি উন্নত করতে পারেন দয়া করে এটি আমি যা ব্যবহার করি তা কিন্তু 100% পরিষ্কার নয়। এটি দুর্দান্ত কাজ করে তবে ইন্টেলিজি নতুন ওয়েদারস্টেশন [0] যুক্ত করেছে। কেন 0?

    public WeatherStation[] removeElementAtIndex(WeatherStation[] array, int index)
    {
        List<WeatherStation> list = new ArrayList<WeatherStation>(Arrays.asList(array));
        list.remove(index);
        return list.toArray(new WeatherStation[0]);
    }


আমরা কেন আপনার প্রশ্নের উন্নতি করব ? হয় আপনি উত্তরটি জানেন, বা আপনি না ´ আপনার অবশ্যই একটি উত্তর প্রদান করা উচিত যা অন্যকে সত্যই সহায়তা করে, এর চেয়ে বেশি বিভ্রান্ত হয় না।
হিমব্রুমবিয়ার

-2

অ্যারে রূপান্তর করতে দুটি লাইনের কোড ব্যবহার করুন যদি আপনি এটি পূর্ণসংখ্যার মানতে ব্যবহার করেন তবে আপনাকে অবশ্যই প্রাথমিক তথ্য প্রকারের জন্য অটোবক্সিং টাইপ ব্যবহার করতে হবে

  Integer [] arr={1,2};
  Arrays.asList(arr);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.