إنشاء ArrayList من الصفيف
-
03-07-2019 - |
سؤال
لدي مصفوفة تمت تهيئتها مثل:
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);
هذا سوف يعمل بشكل جيد.لكن بعض التحذيرات:
- تم إرجاع القائمة من asList حجم ثابت.لذا، إذا كنت تريد أن تكون قادرًا على إضافة عناصر أو إزالتها من القائمة التي تم إرجاعها في التعليمات البرمجية الخاصة بك، فسوف تحتاج إلى تغليفها في ملف جديد
ArrayList
.وإلا سوف تحصل علىUnsupportedOperationException
. - القائمة عادت من
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);
يمكنك التحويل باستخدام طرق مختلفة
List<Element> list = Arrays.asList(array);
List<Element> list = new ArrayList();
Collections.addAll(list, array);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());
}
فإذا رأينا تعريف
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
.قد تكون هناك إجابة أخرى لهذا السؤال أيضًا.
إذا رأيت إعلانًا لـ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))