অ্যারে থেকে পরিবর্তনীয় তালিকা তৈরি করবেন?


85

অ্যারের Listসামগ্রীগুলি সংশোধন করার জন্য আমার একটি অ্যারে রয়েছে যা আমি একটিতে পরিণত করতে চাই ।

স্ট্যাক ওভারফ্লো প্রশ্ন / উত্তর প্রচুর যে ঠিকানা আছে Arrays.asList()এবং কিভাবে এটি শুধুমাত্র অন্তর্নিহিত অ্যারের একটি তালিকা দেখুন প্রদান করে, এবং কিভাবে ফলে তালিকা নিপূণভাবে করার চেষ্টা সাধারণত নিক্ষেপ করা হবে একটি UnsupportedOperationExceptionতালিকা নিপূণভাবে (যেমন ব্যবহারের জন্য পদ্ধতি যেমন add(), remove()ইত্যাদি) হয় সরবরাহিত তালিকার প্রয়োগ দ্বারা কার্যকর করা হয়নি Arrays.asList()

তবে কীভাবে একটি অ্যারেটিকে পরিবর্তনীয় তালিকায় রূপান্তর করা যায় তার উদাহরণ আমি পাই না। আমি মনে করি আমি অ্যারে এবং put()প্রতিটি মান একটি নতুন তালিকার মধ্যে লুপ করতে পারি , তবে আমি ভাবছি যে আমার জন্য এটি করার জন্য কোনও ইন্টারফেস রয়েছে কি না।

উত্তর:


122

একটি সহজ উপায়:

Foo[] array = ...;
List<Foo> list = new ArrayList<Foo>(Arrays.asList(array));

এটি একটি পরিবর্তনীয় তালিকা তৈরি করবে - তবে এটি আসল অ্যারের অনুলিপি হবে । তালিকা পরিবর্তন করলে অ্যারে পরিবর্তন হবে না । অবশ্যই এটি পরে আপনি অনুলিপি করতে পারেন toArray

আপনি যদি কোনও অ্যারেতে পরিবর্তনযোগ্য দৃষ্টিভঙ্গি তৈরি করতে চান তবে আমি বিশ্বাস করি যে এটি আপনাকে নিজেই প্রয়োগ করতে হবে।


4
অ্যারেস.এএসলিস্ট একটি অ্যারেতে একটি দৃশ্য ফেরত দেয়, সেই পরিবর্তনের পদ্ধতিগুলি সমর্থন করে যা তালিকার আকারকে প্রভাবিত করে না
টিমো ওয়েস্টক্যাম্পার

4
@ জন-স্কিট আমি জানি, আমি কেবল এটাই জানিয়েছিলাম যে অ্যারেস.এএসলিস্ট আপনাকে সীমিত পরিবর্তনের সাথে একটি অ্যারে ব্যাকড লিস্ট দেয়, আপনার যদি যোগ / অপসারণ / সন্নিবেশ করা প্রয়োজন তবে অ্যারেলিস্ট মোড়ানো একটি আরও ভাল পদ্ধতির is
টিমো ওয়েস্টক্যাম্পার

4
এই সমস্ত স্থিতিশীল কারখানার পদ্ধতিতে জাভাটির পরিবর্তনীয় / অপরিবর্তনীয়তা পরিষ্কার করা দরকার। রানটাইমের সময় আপনি একটি অপরিবর্তনীয় জিনিস তৈরি করেছেন তা খুঁজে বের করার জন্য এটি বিড়বিড় করে।
ডাস্টিনেভান

4
@ ডাস্টিনেভেন: ডকুমেন্টেশনটি বেশ পরিষ্কার আইএমও: "নির্দিষ্ট অ্যারে দ্বারা ব্যাক করা একটি নির্দিষ্ট আকারের তালিকা ফিরিয়ে দেয় ((ফিরে আসা তালিকার পরিবর্তনগুলি" অ্যারেতে "মাধ্যমে লিখুন)")
জন স্কিটে

4
@ জোনস্কিট আপনার সময় নষ্ট করতে চান না - আপনি যা করছেন তার জন্য ধন্যবাদ। আমি নিজের নামগুলিতে আরও স্পষ্টতার জন্য একটি ভোট দিতে চাই - আমি নিশ্চিত যে দস্তাবেজগুলি পরিষ্কার। আমাদের মধ্যে কয়েকজন ভাষার মধ্যে নাচ করছে এবং অন্যান্য ভাষায় এটি যথাযথভাবে স্পষ্ট।
ডাস্টিনেভান

23

এবং যদি আপনি গুগল সংগ্রহের এপিআই এর (পেয়ারা) ব্যবহার করেন:

Lists.newArrayList(myArray);

4
এটি সবচেয়ে সংক্ষিপ্ত উত্তর। ধন্যবাদ
ইউজেন 82

4
এমনকি পেয়ারা নিজেই যে কোনও একটি ব্যবহারের পরামর্শ দিয়েছিল new ArrayList<>(Arrays.asList(...))- পদ্ধতির জাভাডোকটি বোঝায় যে এটি হ্রাস করা হবে কারণ এটি যথেষ্ট পরিমাণে কার্যকর নয়।
লোগান পিকআপ

4
2020 এবং এখনও অবহেলিত নয়। ঝাঁপ দাও!
মার্কথেগ্রিয়া

13

জাভা 8 এ অন্তর্ভুক্ত স্ট্রিম এপিআই ব্যবহার করে এই সাধারণ কোডটি আপনার অ্যারের উপাদানগুলি সমন্বিত একটি পরিবর্তনীয় তালিকা (বা দেখুন) তৈরি করে:

Foo[] array = ...;
List<Foo> list = Stream.of(array).collect(Collectors.toCollection(ArrayList::new));

বা, সমানভাবে বৈধ:

List<Foo> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));

4

আপনি যদি এক্লিপস সংগ্রহগুলি (পূর্বে জিএস সংগ্রহ ) ব্যবহার করেন তবে আপনি ব্যবহার করতে পারেন FastList.newListWith(...)বা FastList.wrapCopy(...)

দুটি পদ্ধতিই ভ্যারাগস গ্রহণ করে, তাই আপনি অ্যারে ইনলাইন তৈরি করতে বা বিদ্যমান অ্যারেটিতে পাস করতে পারেন।

MutableList<Integer> list1 = FastList.newListWith(1, 2, 3, 4);

Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);

দুটি পদ্ধতির মধ্যে পার্থক্যটি অ্যারে অনুলিপি করা হয় কিনা। newListWith()অ্যারের অনুলিপি করে না এবং এভাবে ধ্রুবক সময় নেয়। অ্যারে অন্য কোথাও রূপান্তরিত হতে পারে তা যদি আপনি জানেন তবে এটি ব্যবহার করা এড়ানো উচিত।

Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);
array2[1] = 5;
Assert.assertEquals(FastList.newListWith(1, 5, 3, 4), list2);

Integer[] array3 = {1, 2, 3, 4};
MutableList<Integer> list3 = FastList.wrapCopy(array3);
array3[1] = 5;
Assert.assertEquals(FastList.newListWith(1, 2, 3, 4), list3);

দ্রষ্টব্য: আমি গ্রহগ্রাহ সংগ্রহের প্রতিশ্রুতিবদ্ধ।


4
এটি একটি দুর্দান্ত সংগ্রহ API আপনি পেয়েছেন। প্রথমটি আমি দেখেছি যা আমার নিজের প্রয়োগগুলি থেকে আমাকে দূরে সরিয়ে দিতে পারে ... কেবলমাত্র এটি মনে হচ্ছে যে আমি সাধারণত দরকারী মনে করি তা হ'ল একটি অ্যারে দ্বারা চালিত একটি সাজানো সেট বাস্তবায়ন (যা আমি খুঁজে পাই এটির চেয়ে অনেক বেশি দক্ষ উভয় ডেটার জন্য ট্রি-ভিত্তিক বাস্তবায়ন যা খুব কমই সংশোধিত হয় বা সেটের জন্য যেগুলি প্রায়শই সংশোধন করা যায় তবে সাধারণত 10 বা ততোধিক উপাদানের কম থাকে)।
জুলে

0
myNewArrayList = new ArrayList<>(Arrays.asList(myArray));

4
@ জোনস্কিট আমি জানি যে আপনার মন্তব্যটি ২০১২ সালের, এবং আমি এখন ভবিষ্যতে প্রেমিক, তবে আমি ধরে নিচ্ছি যে এই মন্তব্যটি আমার আইডিইকে বিশেষভাবে আন্ডারলাইন করে বিবেচনা করে নি এবং বলেছে "আরে, এটি দিয়ে কোনও ঘোষণা করবেন না ঘোষিত প্রকার। আপনার সেখানে দরকার নেই "?
ব্রেন্ট থোয়েনেন

4
@ ব্রেন্টথোয়েন: আপনার মন্তব্য আমি বুঝতে পারছি না। আপনি কি লক্ষ্য করেছেন যে আমার মন্তব্যটি সংশোধন 1, যা ব্যবহৃত myNewArrayList = new ArrayList(...), অর্থাৎ কাঁচা টাইপকে বোঝায়? "সংকলককে কোনও টাইপ আর্গুমেন্ট তৈরি করতে হীরা অপারেটর ব্যবহার করা" এবং "কাঁচা টাইপ ব্যবহার করে" এর মধ্যে পার্থক্য রয়েছে।
জন স্কিটি

4
আমি এই উত্তরটি পোস্ট করেছি এবং পুরো সময় বিস্মৃত হয়েছি যে @ জনস্কিট নিজেই আমার উত্তর সম্পর্কে মন্তব্য করেছিলেন। মন্তব্য করার জন্য ব্রেন্ট ধন্যবাদ।
সিড

@ জোনস্কিট আহ, আমার খারাপ। আপনি যে মন্তব্যটি মন্তব্য করেছিলেন তা আমি পরীক্ষা করে দেখিনি। আমি ২০১২ সালে জাভা খালি হীরা অপারেটরটিকেও একটি কাঁচা ধরণের হিসাবে ধরে নিয়েছিলাম wrong এটাই আমার খ। উত্তর করার জন্য ধন্যবাদ!
ব্রেন্ট থোয়েনেন

0

স্ট্রিমস এপিআই ব্যবহার করে অন্য বিকল্প যুক্ত করা হচ্ছে:

List<Foo> list = Arrays.stream(array).collect(Collectors.toList());

4
আপনার সমাধানের সাথে সমস্যাটি হ'ল সংগ্রাহকদের # টু লিস্টে মিউচ্যালিটির কোনও গ্যারান্টি নেই , এবং সেইজন্য প্রয়োজনীয়তাগুলির সাথে এটি খাপ খায় না।
মিকায়েলএফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.