java - قم بإنشاء ArrayList من الصفيف




arrays type-conversion (25)

لدي صفيف يتم تهيئته مثل:

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

أرغب في تحويل هذا المصفوفة إلى كائن من فئة ArrayList.

ArrayList<Element> arraylist = ???;

Answers

new ArrayList<T>(Arrays.asList(myArray));

تأكد من أن myArray هو نفس نوع T ستحصل على خطأ في المحول البرمجي إذا حاولت إنشاء List<Integer> من صفيف int ، على سبيل المثال.


يمكننا بسهولة تحويل مصفوفة إلى ArrayList . نحن نستخدم طريقة addAll() لواجهة addAll() لغرض نسخ المحتوى من قائمة إلى أخرى.

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

كما قال كل هذا سوف يفعل ذلك

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

والطريقة الأحدث الشائعة لإنشاء مصفوفة هي obsableArrays

قائمة المراقبة: قائمة تسمح للمستمعين بتتبع التغييرات عند حدوثها.

ل Java SE يمكنك أن تجرب

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

هذا وفقًا لـ Oracle Docs

observableArrayList () ينشئ قائمة جديدة فارغة يمكن تدوينها مدعومة من قبل arraylist. observableArrayList (E ... items) ينشئ قائمة مصفوفة يمكن ملاحظتها مع العناصر المضافة إليها.

تحديث جافا 9

أيضا في Java 9 إنه سهل بعض الشيء:

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

إذا كنت تستخدم :

new ArrayList<T>(Arrays.asList(myArray));

يمكنك إنشاء وملء قائمتين! ملء قائمة كبيرة مرتين هو بالضبط ما لا تريد القيام به لأنه سيخلق مصفوفة Object[] آخر Object[] كل مرة تحتاج السعة إلى تمديدها.

لحسن الحظ أن تنفيذ JDK سريع و Arrays.asList(a[]) جيد للغاية. إنشاء نوع من ArrayList المسمى Arrays.ArrayList حيث تشير البيانات كائن [] مباشرة إلى الصفيف.

// in Arrays
@SafeVarargs
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}
//still in Arrays, creating a private unseen class
private static class ArrayList<E>

    private final E[] a;    
    ArrayList(E[] array) {
        a = array; // you point to the previous array
    }
    ....
}

الجانب الخطير هو أنه إذا قمت بتغيير الصفيف الأولي ، يمكنك تغيير القائمة! هل أنت متأكد أنك تريد ذلك؟ ممكن نعم ممكن لا.

إذا لم يكن الأمر كذلك ، فإن الطريقة الأكثر مفهومة هي القيام بذلك:

ArrayList<Element> list = new ArrayList<Element>(myArray.length); // you know the initial capacity
for (Element element : myArray) {
    list.add(element);
}

أو كما قالglglgl ، يمكنك إنشاء ArrayList مستقل آخر مع:

new ArrayList<T>(Arrays.asList(myArray));

أنا أحب استخدام Collections ، Arrays ، أو الجوافة. ولكن إذا لم يكن ذلك مناسبًا ، أو كنت لا تشعر به ، فما عليك إلا كتابة سطر آخر غير لائق بدلاً من ذلك.


على الرغم من وجود العديد من الإجابات المكتوبة تمامًا على هذا السؤال ، فسوف أقوم بإضافة مدخلاتي.

لنفترض أن لديك Element[] array = { new Element(1), new Element(2), new Element(3) };

يمكن إنشاء ArrayList جديد بالطرق التالية

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

// Add through a collection
ArrayList<Element> arraylist_3 = new ArrayList<>();
Collections.addAll(arraylist_3, array);

وتدعم جيدا جميع عمليات ArrayList

arraylist_1.add(new Element(4)); // or remove(): Success
arraylist_2.add(new Element(4)); // or remove(): Success
arraylist_3.add(new Element(4)); // or remove(): Success

ولكن العمليات التالية بإرجاع عرض قائمة ArrayList وليس ArrayList الفعلي.

// Returns a List view of array and not actual ArrayList
List<Element> listView_1 = (List<Element>) Arrays.asList(array);
List<Element> listView_2 = Arrays.asList(array);
List<Element> listView_3 = Arrays.asList(new Element(1), new Element(2), new Element(3));

لذلك ، فإنها تعطي خطأ عند محاولة إجراء بعض العمليات ArrayList

listView_1.add(new Element(4)); // Error
listView_2.add(new Element(4)); // Error
listView_3.add(new Element(4)); // Error

المزيد عن تمثيل قائمة link الصفيف.


معطى:

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

أبسط الإجابة هي:

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

هذا سوف يعمل بشكل جيد. لكن بعض التحذيرات:

  1. القائمة التي تم إرجاعها من asList لها حجم ثابت . لذلك ، إذا كنت تريد أن تكون قادرًا على إضافة عناصر أو إزالتها من القائمة التي تم إرجاعها في التعليمات البرمجية ، فستحتاج إلى لفها في ArrayList جديد. وإلا ستحصل على UnsupportedOperationException .
  2. يتم إرجاع القائمة التي يتم إرجاعها من asList() بواسطة الصفيف الأصلي. إذا قمت بتعديل المصفوفة الأصلية ، فسيتم تعديل القائمة أيضًا. هذا قد يكون من المستغرب.

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

جافا 9

في Java 9 ، يمكنك استخدام أسلوب List.of ثابت من أجل إنشاء 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: أساليب مصنع الراحة للمجموعات

توفر JEP 269 بعض طرق مصنع الراحة لـ Java Collections API. يتم تضمين طرق المصنع الثابتة الثابتة هذه في واجهات القائمة والمجموعة Map في Java 9 والإصدارات الأحدث.


  1. إذا رأينا تعريف طريقة Arrays.asList() ستحصل على شيء كهذا:

     public static <T> List<T> asList(T... a) //varargs are of T type. 
    

    لذلك ، يمكنك تهيئة arraylist مثل هذا:

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

    ملاحظة : سيتم التعامل مع كل new Element(int args) على أنه كائن فردي ويمكن تمريره var-args .

  2. قد يكون هناك إجابة أخرى لهذا السؤال أيضًا.
    إذا رأيت إعلانًا عن طريقة java.util.Collections.addAll() فستحصل على شيء كالتالي:

    public static <T> boolean addAll(Collection<? super T> c, T... a);
    

    لذلك ، هذا الرمز مفيد أيضًا للقيام بذلك

    Collections.addAll(arraylist, array);
    

آخر تحديث ، ما يقرب من عام 2014 ، يمكنك القيام بذلك مع جافا 8 أيضا:

ArrayList<Element> arrayList = Stream.of(myArray).collect(Collectors.toCollection(ArrayList::new));

سيتم حفظ بعض الأحرف ، إذا كان هذا مجرد List

List<Element> list = Stream.of(myArray).collect(Collectors.toList());


يمكنك أيضا القيام بذلك مع دفق في Java 8.

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

(الخيط القديم ، ولكن 2 سنت فقط كما ذكر أيا من الجوافة أو غيرها من libs وبعض التفاصيل الأخرى)

إذا استطعت ، استخدم الجوافة

تجدر الإشارة إلى طريقة الجوافة ، التي تبسط إلى حد كبير هذه الخدع:

استعمال

للحصول على قائمة غير قابلة للتغيير

استخدم الفئة copyOf() الخاصة of() و 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

يرجى أيضًا ملاحظة الطرق المشابهة لهياكل البيانات الأخرى في الفئات الأخرى ، على سبيل المثال في Sets .

لماذا الجوافة؟

يمكن أن يكون عامل الجذب الرئيسي هو تقليل الفوضى بسبب الأدوية الجنسية لسلامة النوع ، حيث أن استخدام طرق مصنع الجوافة يسمح باستنتاج الأنواع في معظم الأوقات. ومع ذلك ، فإن هذه الحجة تحمل كمية أقل من المياه منذ وصل Java 7 مع مشغل الماس الجديد.

ولكن هذا ليس السبب الوحيد (وجافا 7 ليس في كل مكان بعد): بناء الجملة المختزلة مفيد جدا أيضا ، وأسطورة الوسائل ، كما رأينا أعلاه ، تسمح لكتابة كود أكثر تعبيرا. أنت تفعل في استدعاء الجوافة واحد ما يأخذ 2 مع مجموعات جافا الحالية.

إذا لم تستطع ...

للحصول على قائمة غير قابلة للتغيير

استخدم فئة Arrays لـ JDK وطريقة asList() ، والملفوفة مع Collections.unmodifiableList() :

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

لاحظ أن النوع الذي تم إرجاعه لـ asList() هو List باستخدام تطبيق ArrayList ملموسة ، ولكنه ليس java.util.ArrayList . هو نوع داخلي ، الذي يحاكي ArrayList ولكنه في الواقع يشير مباشرة إلى الصفيف الذي تم تمريره ويجعله "الكتابة خلال" (تنعكس التعديلات في الصفيف).

ويمنع التعديل من خلال بعض أساليب List API عن طريق ببساطة توسيع AbstractList (لذا ، فإن إضافة أو إزالة العناصر غير مدعوم) ، ومع ذلك يسمح للمكالمات set() لتجاوز العناصر. وبالتالي ، فإن هذه القائمة ليست ثابتة asList() ويجب أن تكون الدعوة إلى asList() ملفوفة مع Collections.unmodifiableList() .

انظر الخطوة التالية إذا كنت بحاجة إلى قائمة قابلة للتغيير.

للحصول على قائمة mutable

مثلما هو مذكور أعلاه ، ولكن يتم تغليفها باستخدام 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+

للأغراض التعليمية: الطريقة الجيدة للدفع

// 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);
}

لتحويل صفيف إلى ArrayList ، غالباً ما يقوم المطورون بذلك:

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

Arrays.asList() بإرجاع ArrayList وهو private static class inside Arrays ، وهي ليست فئة java.util.ArrayList. The java.util.Arrays.ArrayList قامت فئة The java.util.Arrays.ArrayList set(), get(), contains() أساليب ، ولكن ليس لديها أي أساليب لإضافة عناصر ، لذلك تم إصلاح حجمها. لإنشاء ArrayList حقيقي ، يجب عليك القيام بما يلي:

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

يمكن لمنشئ ArrayList قبول نوع التجميع ، والذي يعد أيضًا نوعًا ممتازًا لـ java.util.Arrays.ArrayList


معطى:

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

استعمال:

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

وفقا للسؤال ، فإن الإجابة باستخدام جافا 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));

اعتبارًا من Java 5 ، يأخذ Arrays.asList() معلمة varargs وليس لديك لإنشاء الصفيف بشكل صريح.


يمكنك القيام بذلك بسهولة بمساعدة Arrays.asList (arrayObj)؛

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

في Java 9 يمكنك استخدام:

List<String> list = List.of("Hello", "World", "from", "Java");
List<Integer> list = List.of(1, 2, 3, 4, 5);

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

إذا كان المصفوفة من النوع البدائي ، فلن تعمل الإجابات المحددة. لكن منذ Java 8 يمكنك استخدام:

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

يمكنك أن تفعل ذلك في جافا 8 على النحو التالي

ArrayList<Element> list = (ArrayList<Element>)Arrays.stream(array).collect(Collectors.toList());

طريقة أخرى (على الرغم من أنها تكافئ بشكل أساسي أداء حل new ArrayList(Arrays.asList(array)) :

Collections.addAll(arraylist, array);

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

كنت أستخدم هذا السطر من الكود:

if (variable.push) {
   // variable is array, since AMAIK only arrays have push() method.
}




java arrays arraylist type-conversion