java - অ্যারে থেকে ArrayList তৈরি করুন




arrays type-conversion (20)

আমার এমন একটি অ্যারে আছে যা শুরু হয়েছে:

Element[] array = {new Element(1), new Element(2), new Element(3)};

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

ArrayList<Element> arraylist = ???;

আরেকটি জাভা 8 সমাধান (আমি বড় সেট মধ্যে উত্তর মিস করতে পারে। যদি তাই হয়, আমার ক্ষমাপ্রার্থী)। এটি একটি অ্যার্যলিস্ট তৈরি করে (একটি তালিকা অনুসারে) অর্থাৎ একটি উপাদানগুলি মুছে ফেলতে পারে

package package org.something.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Junk {

    static <T> ArrayList<T>  arrToArrayList(T[] arr){
        return Arrays.asList(arr)
            .stream()
            .collect(Collectors.toCollection(ArrayList::new));
    }

    public static void main(String[] args) {
        String[] sArr = new String[]{"Hello", "cruel", "world"};
        List<String> ret = arrToArrayList(sArr);
        // Verify one can remove an item and print list to verify so
        ret.remove(1);
        ret.stream()
            .forEach(System.out::println);
    }
}

আউটপুট হয় ...
হ্যালো
বিশ্ব


জাভা 9

জাভা 9 এ , আপনি List লিখন তৈরি করতে স্ট্যাটিক ফ্যাক্টরি পদ্ধতির List ব্যবহার করতে পারেন। নিম্নলিখিত কিছু ভালো:

List<Element> elements = List.of(new Element(1), new Element(2), new Element(3));

এই তিনটি উপাদান ধারণকারী একটি immutable তালিকা ফিরে আসবে। যদি আপনি একটি পরিবর্তনযোগ্য তালিকা চান, তবে ArrayList কন্সট্রকটারে সেই তালিকাটি প্রেরণ করুন:

new ArrayList<>(List.of(// elements vararg))

JEP 269: সংগ্রহের জন্য সুবিধার্থে কারখানার পদ্ধতি

জেইপি 269 জাভা সংগ্রহ API এর জন্য কিছু সুবিধাজনক কারখানা পদ্ধতি সরবরাহ করে। এই অপরিবর্তনীয় স্ট্যাটিক কারখানা পদ্ধতিগুলি জাভা 9 এবং পরবর্তীতে List , Set এবং Map ইন্টারফেসগুলিতে তৈরি করা হয়েছে।


অ্যারের একটি আদিম টাইপ হয়, প্রদত্ত উত্তর কাজ করবে না। কিন্তু জাভা 8 থেকে আপনি ব্যবহার করতে পারেন:

int[] array = new int[5];
Arrays.stream(array).boxed().collect(Collectors.toList());

আপনি Arrays.asList (arrayObj) এর সাহায্যে এটি সহজেই করতে পারেন;

Element[] array = {new Element(1), new Element(2), new Element(3)};
ArrayList<Element> arraylist =Arrays.asList(array);

আপনি জাভা 8 এ স্ট্রিম দিয়ে এটি করতে পারেন।

 List<Element> elements = Arrays.stream(array).collect(Collectors.toList()); 

আপনি বিভিন্ন পদ্ধতি ব্যবহার করে রূপান্তর করতে পারেন

  1. List<Element> list = Arrays.asList(array);

  2. List<Element> list = new ArrayList();
    Collections.addAll(list, array);

  3. Arraylist list = new Arraylist();
    list.addAll(Arrays.asList(array));

বিস্তারিত জানার জন্য আপনি http://javarevisited.blogspot.in/2011/06/converting-array-to-arraylist-in-java.html পড়ুন


আপনি সম্ভবত একটি তালিকা প্রয়োজন, একটি ArrayList না। যে ক্ষেত্রে আপনি শুধু করতে পারেন:

List<Element> arraylist = Arrays.asList(array);

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

 Arraylist arr = new Arraylist();
 arr.addAll(Arrays.asList(asset));

আরেকটি উপায় (যদিও new ArrayList(Arrays.asList(array)) সমতুল্য সমতুল্য new ArrayList(Arrays.asList(array)) সমাধান কর্মক্ষমতা অনুসারে:

Collections.addAll(arraylist, array);

আরেকটি সরল উপায় হল অ্যারের সমস্ত উপাদানগুলিকে একটি-প্রতিটি লুপ ব্যবহার করে একটি নতুন অ্যারেস্টিস্টে যুক্ত করা।

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

for(Element e : array)
    list.add(e);

জাভা 8 থেকে রূপান্তর করার একটি সহজ উপায় রয়েছে:

public static <T> List<T> fromArray(T[] array) {
    return Arrays.stream(array).collect(toList());
}

তাই করতে সহজ উপায় নিম্নলিখিত কোড যোগ করে। চেষ্টা এবং পরীক্ষিত.

String[] Array1={"one","two","three"};
ArrayList<String> s1= new ArrayList<String>(Arrays.asList(Array1));

প্রদত্ত:

Element[] array = new Element[] { new Element(1), new Element(2), new Element(3) };

সবচেয়ে সহজ উত্তর হল:

List<Element> list = Arrays.asList(array);

এই জরিমানা কাজ করবে। কিন্তু কিছু সতর্কতা:

  1. তালিকা থেকে ফিরে তালিকা নির্ধারিত আকার হয়েছে । সুতরাং, যদি আপনি আপনার ArrayList ফেরত তালিকা থেকে উপাদান যুক্ত করতে বা অপসারণ করতে সক্ষম হন তবে আপনাকে এটি একটি নতুন ArrayList মোড়ানো দরকার। অন্যথায় আপনি একটি UnsupportedOperationException
  2. আসল তালিকা থেকে ফিরে আসা asList() মূল অ্যারের দ্বারা সমর্থিত। আপনি যদি মূল অ্যারে সংশোধন করেন তবে তালিকাটিও সংশোধন করা হবে। এই বিস্ময়কর হতে পারে।

প্রশ্নের সাথে জাভা 1.7 ব্যবহার করে উত্তরটি হল:

ArrayList<Element> arraylist = new ArrayList<Element>(Arrays.<Element>asList(array));

তবে এটি সবসময় ইন্টারফেস ব্যবহার ভাল:

List<Element> arraylist = Arrays.<Element>asList(array);

যেহেতু এই প্রশ্নটি বেশ পুরনো, তাই আমাকে অবাক করে দেয় যে কেউ এখনও সহজ ফর্মটি প্রস্তাব করেনি:

List<Element> arraylist = Arrays.asList(new Element(1), new Element(2), new Element(3));

জাভা 5 অনুসারে, Arrays.asList() একটি varargs পরামিতি নেয় এবং আপনি অ্যারে স্পষ্টভাবে নির্মাণ করতে হবে না।


সব হিসাবে এই বলে তাই হবে

 new ArrayList<>(Arrays.asList(array))

এবং অ্যারে তৈরি করার সাধারণতম নতুন উপায় পর্যবেক্ষণযোগ্য

পর্যবেক্ষণযোগ্য তালিকা : এমন একটি তালিকা যা শ্রোতাদের পরিবর্তন ঘটায় তা পরিবর্তন করার অনুমতি দেয়।

জাভা SE এর জন্য আপনি চেষ্টা করতে পারেন

FXCollections.observableArrayList(new Element(1), new Element(2), new Element(3));

যে Oracle ডক্স অনুযায়ী

পর্যবেক্ষণযোগ্য ArrayList () একটি অ্যারের তালিকা দ্বারা সমর্থিত একটি নতুন খালি পর্যবেক্ষণযোগ্য তালিকা তৈরি করে। পর্যবেক্ষণযোগ্য ArrayList (ই ... আইটেম) এটি যোগ আইটেম সঙ্গে একটি নতুন পর্যবেক্ষণযোগ্য অ্যারে তালিকা তৈরি করে।

জাভা 9 আপডেট করুন

জাভা 9 এ এটি একটু সহজ:

List<String> list = List.of("element 1", "element 2", "element 3");

(পুরাতন থ্রেড, কিন্তু শুধুমাত্র 2 সেন্ট হিসাবে কেউ গৌয়া বা অন্যান্য libs এবং কিছু অন্যান্য বিবরণ উল্লেখ)

যদি আপনি পারেন, গুয়াভা ব্যবহার করুন

এটি গুয়াভা পথকে নির্দেশ করে মূল্যবান, যা এই শেনানিজানকে সহজ করে তোলে:

ব্যবহার

একটি অপ্রয়োজনীয় তালিকা জন্য

copyOf() ক্লাস এবং তার of() এবং copyOf() ফ্যাক্টরি পদ্ধতিগুলি ব্যবহার করুন (উপাদানগুলি copyOf() হতে পারে না) :

List<String> il = ImmutableList.of("string", "elements");  // from varargs
List<String> il = ImmutableList.copyOf(aStringArray);      // from array

একটি পরিবর্তনযোগ্য তালিকা জন্য

Lists শ্রেণি এবং তার newArrayList() কারখানা পদ্ধতিগুলি ব্যবহার করুন:

List<String> l1 = Lists.newArrayList(anotherListOrCollection);    // from collection
List<String> l2 = Lists.newArrayList(aStringArray);               // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs

উদাহরণস্বরূপ, অন্যান্য ক্লাসগুলিতে অন্যান্য ডাটা স্ট্রাকচারগুলির জন্য একই পদ্ধতিগুলি দয়া করে নোট করুন।

কেন গুরাভ?

টাইপ-সিকিউরিটির জন্য জেনেরিকসের কারণে জেনারিকসের কারণে ক্লাটারটি হ্রাস করাতে প্রধান আকর্ষণ হতে পারে, কারণ গুয়াভা ফ্যাক্টরি পদ্ধতির ব্যবহারগুলি বেশিরভাগ সময়ে টাইপ করা যায়। যাইহোক, এই যুক্তি জাভা 7 নতুন হীরা অপারেটরের সাথে এসে পৌঁছানোর পরে কম জল ধারণ করে।

কিন্তু এটি একমাত্র কারণ নয় (এবং জাভা 7 এখনও সর্বত্র নেই): শর্ট্যান্ড সিনট্যাক্সটি খুব সহজ, এবং উপরের দিকে দেখানো পদ্ধতিগুলির সূচনাকারীরা আরো এক্সপ্রেসিভ কোড লেখার অনুমতি দেয়। আপনি একটি গুয়াব কল করুন যা বর্তমান জাভা সংগ্রহগুলির সাথে 2 লাগে।

যদি তুমি না পারো ...

একটি অপ্রয়োজনীয় তালিকা জন্য

JDK এর Arrays ক্লাস এবং asList() কারখানার পদ্ধতিটি ব্যবহার করুন, একটি Collections.unmodifiableList() সহ মোড়ানো:

List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));

উল্লেখ্য যে asList() জন্য ফেরত টাইপ একটি কংক্রিট ArrayList প্রয়োগকরণ ব্যবহার করে একটি List , তবে এটি java.util.ArrayList নয় । এটি একটি অভ্যন্তরীণ প্রকার, যা একটি ArrayList অনুকরণ করে তবে প্রকৃতপক্ষে সরাসরি অ্যারেটিকে উল্লেখ করে এবং এটি "মাধ্যমে লিখুন" করে তোলে (পরিবর্তনগুলি অ্যারের মধ্যে প্রতিফলিত হয়)।

এটি List API এর পদ্ধতির মাধ্যমে কেবলমাত্র একটি AbstractList প্রসারিত করার মাধ্যমে (তাই, যোগ বা অপসারণ করা উপাদানগুলি অসমর্থিত) পদ্ধতির মাধ্যমে সংশোধনীগুলিকে নিষিদ্ধ করে তবে এটি কলগুলিকে ওভাররাইড করার জন্য set() কে set() করার অনুমতি দেয়। সুতরাং এই তালিকাটি সত্যিকারের asList() এবং asList() একটি কল Collections.unmodifiableList() করা উচিত Collections.unmodifiableList()

আপনি একটি পরিবর্তনযোগ্য তালিকা প্রয়োজন হলে পরবর্তী পদক্ষেপ দেখুন।

একটি পরিবর্তনযোগ্য তালিকা জন্য

উপরে হিসাবে একই, কিন্তু একটি প্রকৃত java.util.ArrayList সঙ্গে আবৃত। java.util.ArrayList :

List<String> l1  = new ArrayList<String>(Arrays.asList(array));    // Java 1.5 to 1.6
List<String> l1b = new ArrayList<>(Arrays.asList(array));          // Java 1.7+
List<String> l2  = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6
List<String> l2b = new ArrayList<>(Arrays.asList("a", "b"));       // Java 1.7+

শিক্ষাগত উদ্দেশ্যে: ভাল ol 'ম্যানুয়াল ওয়ে

// for Java 1.5+
static <T> List<T> arrayToList(final T[] array) {
  final List<T> l = new ArrayList<T>(array.length);

  for (final T s : array) {
    l.add(s);
  }
  return (l);
}

// for Java < 1.5 (no generics, no compile-time type-safety, boo!)
static List arrayToList(final Object[] array) {
  final List l = new ArrayList(array.length);

  for (int i = 0; i < array.length; i++) {
    l.add(array[i]);
  }
  return (l);
}

একটি অ্যারে একটি অ্যারেস্টিস্ট রূপান্তর করতে, ডেভেলপাররা প্রায়ই এটি করে:

List<String> list = Arrays.asList(arr);// this is wrong way..

Arrays.asList() একটি Arrays.asList() করবে যা private static class inside Arrays একটি private static class inside Arrays , এটি java.util.ArrayList ক্লাস নয়। The java.util.Arrays.ArrayList ক্লাস set(), get(), contains() পদ্ধতি, কিন্তু উপাদান যোগ করার জন্য কোন পদ্ধতি নেই, তাই তার আকার সংশোধন করা হয়। একটি বাস্তব ArrayList তৈরি করতে, আপনাকে অবশ্যই করতে হবে:

ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));

ArrayList এর কন্সট্রাকটর একটি সংগ্রহের ধরন গ্রহণ করতে পারে, যা java.util.Arrays.ArrayList জন্যও একটি সুপার টাইপ।


// Guava
import com.google.common.collect.ListsLists
...
List<String> list = Lists.newArrayList(aStringArray); 

new ArrayList<>(Arrays.asList(array))







type-conversion