سؤال

لدي مصفوفة تمت تهيئتها مثل:

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

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

ArrayList<Element> arraylist = ???;
هل كانت مفيدة؟

المحلول

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

نصائح أخرى

منح:

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() مدعوم بالمصفوفة الأصلية.إذا قمت بتعديل المصفوفة الأصلية، فسيتم تعديل القائمة أيضًا.قد يكون هذا مفاجئا.

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

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

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

الاستخدام

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

استخدم ال ImmutableList الطبقة و 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 مع مشغل الماس الجديد.

لكنه ليس السبب الوحيد (و Java 7 ليس في كل مكان حتى الآن):كما أن بناء الجملة المختصرة مفيد جدًا أيضًا، وتسمح مُهيئات الأساليب، كما هو موضح أعلاه، بكتابة تعليمات برمجية أكثر تعبيرًا.يمكنك القيام بمكالمة جوافة واحدة بما يتطلب 2 مع مجموعات Java الحالية.


إذا كنت لا تستطيع...

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

استخدم JDK Arrays الطبقة و 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() ينبغي أن تكون ملفوفة مع Collections.unmodifiableList().

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

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

نفس ما ورد أعلاه، ولكن ملفوفة مع الفعلي 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);
}

وبما أن هذا السؤال هو قديمة جدا، ويدهشني أن لا أحد اقترح أبسط شكل بعد:

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

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

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

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

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

Collections.addAll(arraylist, array);

جافا 9

في جافا 9, ، يمكنك استخدام List.of طريقة المصنع الثابتة من أجل إنشاء ملف List حرفي.شيء مثل ما يلي:

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

هذا من شأنه أن يعود غير قابل للتغيير قائمة تحتوي على ثلاثة عناصر.إذا كنت تريد أ متقلب القائمة، قم بتمرير تلك القائمة إلى ArrayList البناء:

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

جيب 269:أساليب المصنع الملائمة للتحصيل

جيب 269 يوفر بعض أساليب المصنع الراحة ل مجموعات جافا واجهة برمجة التطبيقات.تم تضمين أساليب المصنع الثابتة هذه في List, Set, ، و Map واجهات في Java 9 والإصدارات الأحدث.

وربما كنت في حاجة الى قائمة وليس ArrayList. في هذه الحالة يمكنك القيام به فقط:

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

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

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

وسيتم انقاذ عدد قليل من الشخصيات، وإذا كان هذا يمكن أن يكون مجرد List

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

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

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

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

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

// 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, أو الجوافة.ولكن إذا لم يكن مناسبًا، أو لم تشعر به، فما عليك سوى كتابة سطر آخر غير أنيق بدلاً من ذلك.

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

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

ووفقا مع السؤال والجواب باستخدام جافا 1.7 هي:

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

ولكن من الأفضل دائما استخدام واجهة:

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

يمكنك التحويل باستخدام طرق مختلفة

  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

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

 new ArrayList<>(Arrays.asList("1","2","3","4"));

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

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

لـ Java SE يمكنك تجربتها

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

هذا وفقا ل مستندات أوراكل

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

تحديث جافا 9

أيضًا في Java 9 يكون الأمر سهلاً بعض الشيء:

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

ويمكنك أيضا أن تفعل ذلك مع تيار في جاوة 8.

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

ومنذ جافا 8 هناك أسهل طريقة لتحويل:

public static <T> List<T> fromArray(T[] array) {
    return Arrays.stream(array).collect(toList());
}
  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);
    

وسيلة بسيطة أخرى لإضافة كافة عناصر من مجموعة إلى ArrayList جديد باستخدام مقابل كل حلقة.

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

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

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

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

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

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

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

ويقول لديك 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

وأكثر على قائمة تمثيل مجموعة صلة .

وأبسط طريقة للقيام بذلك هو بإضافة التعليمات البرمجية التالية. تمت تجربتها واختبارها.

String[] Array1={"one","two","three"};
ArrayList<String> s1= new ArrayList<String>(Arrays.asList(Array1));
<اقتباس فقرة>   

وحل آخر Java8 <م> (ربما أكون قد غاب عن الإجابة من بين مجموعة كبيرة. إذا كان الأمر كذلك، اعتذاري). وهذا يخلق ArrayList (في مقابل قائمة) أي واحد يمكن حذف العناصر

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

والناتج هو ...
مرحبا
العالم

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

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

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

لذا، سأقدم هنا مثالًا قصيرًا لحالتي استخدام.

  • إنشاء مجموعة غير قابلة للتغيير ::عندما لا تريد تعديل كائن المجموعة بعد إنشائه

    List<Element> elementList = Arrays.asList(array)

  • إنشاء مجموعة قابلة للتغيير ::عندما قد ترغب في تعديل كائن المجموعة الذي تم إنشاؤه بعد الإنشاء.

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

استخدم التعليمات البرمجية التالية لتحويل مجموعة العنصر إلى ArrayList.

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

ArrayList<Element>elementArray=new ArrayList();
for(int i=0;i<array.length;i++) {
    elementArray.add(array[i]);
}

ويمكنك إنشاء ArrayList باستخدام Cactoos (وأنا واحد من المطورين):

List<String> names = new StickyList<>(
  "Scott Fitzgerald", "Fyodor Dostoyevsky"
);

وليس هناك ما يضمن أن الكائن سوف يكون في الواقع من ArrayList الصف. إذا كنت بحاجة إلى ذلك الضمان، القيام بذلك:

ArrayList<String> list = new ArrayList<>(
  new StickyList<>(
    "Scott Fitzgerald", "Fyodor Dostoyevsky"
  )
);

استخدم رمز أدناه

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

وهذا هو وسيلة واضحة لذلك

ArrayList<Element> arraylist = new ArrayList<>(Arrays.asList(array))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top