سؤال

كيف يمكنني تحويل صفيف إلى قائمة في جافا؟

لقد استخدمت Arrays.asList() لكن السلوك (والتوقيع) تغير بطريقة أو بأخرى من جافا سي 1.4.2 (مستندات الآن في الأرشيف) إلى 8 ومعظم القصاصات التي وجدتها على الويب تستخدم سلوك 1.4.2.

علي سبيل المثال:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
  • في 1.4.2 إرجاع قائمة تحتوي على العناصر 1 ، 2 ، 3
  • في 1.5.0+ إرجاع قائمة تحتوي على البريد العشوائي

في كثير من الحالات ، يجب أن يكون من السهل اكتشافها ، ولكن في بعض الأحيان يمكن أن تنزلق دون أن يلاحظها أحد:

Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);
هل كانت مفيدة؟

المحلول

في مثالك ، لأنه لا يمكن أن يكون لديك قائمة بالنوع البدائي. بعبارات أخرى، List<int> غير ممكن.

ومع ذلك ، يمكنك الحصول على ملف List<Integer> باستخدام Integer الطبقة التي تلتف int بدائية. قم بتحويل صفيفك إلى List مع ال Arrays.asList طريقة المنفعة.

Integer[] spam = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(spam);

انظر الى هذا رمز التشغيل على الهواء مباشرة في ideone.com.

نصائح أخرى

في Java 8 ، يمكنك استخدام التدفقات:

int[] spam = new int[] { 1, 2, 3 };
Arrays.stream(spam)
      .boxed()
      .collect(Collectors.toList());

عند الحديث عن طريقة التحويل ، يعتمد ذلك على سبب حاجتك List. إذا كنت بحاجة إليها فقط لقراءة البيانات. حسنا تفضل:

Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);

ولكن بعد ذلك إذا فعلت شيئًا كهذا:

list.add(1);

لقد حصلت java.lang.UnsupportedOperationException. لذلك بالنسبة لبعض الحالات ، فأنت بحاجة إلى هذا:

Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));

النهج الأول في الواقع لا يحول الصفيف ولكنه "يمثل" مثل أ List. لكن الصفيف تحت غطاء محرك السيارة مع جميع خصائصه مثل عدد العناصر الثابتة. يرجى ملاحظة أنك بحاجة إلى تحديد النوع عند البناء ArrayList.

المشكلة هي أن Varargs تم تقديمها في Java5 وللأسف ، Arrays.asList() حصلت على تحميل مع إصدار Vararg أيضا. لذا Arrays.asList(spam) يفهمه برنامج التحويل البرمجي Java5 كمعلمة Vararg من صفائف int.

يتم شرح هذه المشكلة بمزيد من التفاصيل في جافا 2nd 2nd. ، الفصل 7 ، البند 42.

يبدو الأمر متأخراً قليلاً ولكن هنا سنتان. لا يمكننا الحصول عليها List<int> مثل int هو نوع بدائي لذلك يمكننا فقط الحصول List<Integer>.

Java 8 (int Array)

int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList()); 

جافا 8 وتحت (مجموعة عدد صحيح)

Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 =  Arrays.asList(integers); // returns a fixed-size list backed by the specified array.
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only

تحتاج arraylist وليس القائمة؟

في حال كنا نريد تنفيذ محدد لـ List على سبيل المثال ArrayList ثم يمكننا استخدام toCollection مثل:

ArrayList<Integer> list24 = Arrays.stream(integers)
                          .collect(Collectors.toCollection(ArrayList::new));

لماذا list21 لا يمكن تعديلها هيكليا؟

عندما نستخدم Arrays.asList تم إصلاح حجم القائمة التي تم إرجاعها لأن القائمة التي تم إرجاعها ليست java.util.ArrayList, ، لكن فئة ثابتة خاصة محددة في الداخل java.util.Arrays. لذلك إذا أضفنا أو أزلنا عناصر من القائمة التي تم إرجاعها ، UnsupportedOperationException سيتم إلقاؤه. لذلك يجب أن نذهب مع list22 عندما نريد تعديل القائمة. إذا كان لدينا Java8 ، فيمكننا أيضًا الذهاب مع list23.

أن تكون واضحا list21 يمكن تعديلها بمعنى أنه يمكننا الاتصال list21.set(index,element) ولكن قد لا يتم تعديل هذه القائمة من الناحية الهيكلية ، أي لا يمكن إضافة أو إزالة العناصر من القائمة. يمكنك أيضًا التحقق من هذا سؤال.


إذا كنا نريد قائمة غير قابلة للتغيير ، فيمكننا لفها على النحو التالي:

List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));

نقطة أخرى نلاحظها هي أن الطريقة Collections.unmodifiableList إرجاع عرض غير قابل للتعديل للقائمة المحددة. مجموعة عرض غير قابلة للتحديد عبارة عن مجموعة لا يمكن التعبير عنها وهي أيضًا عرض في مجموعة دعم. لاحظ أن التغييرات في مجموعة الدعم قد لا تزال ممكنة ، وإذا حدثت ، فهي مرئية من خلال العرض غير القابل للتحرير.

يمكن أن يكون لدينا قائمة غير قابلة للتغيير في Java 10.

Java 10 (قائمة ثابتة حقًا) بطريقتين:

  1. List.copyOf(Arrays.asList(integers))
  2. Arrays.stream(integers).collect(Collectors.toUnmodifiableList());

تحقق أيضا من هذا إجابه من لي للمزيد.

اضطررت مؤخرًا إلى تحويل مجموعة إلى قائمة. في وقت لاحق من البرنامج ، تم تصفية القائمة التي تحاول إزالة البيانات. عند استخدام وظيفة Arrays.Aslist (Array) ، يمكنك إنشاء مجموعة بحجم ثابت: لا يمكنك إضافة أو حذف. يفسر هذا الإدخال المشكلة أفضل مما أستطيع: لماذا أحصل على unsupportedOperationException عند محاولة إزالة عنصر من قائمة؟.

في النهاية ، اضطررت إلى إجراء تحويل "يدوي":

    List<ListItem> items = new ArrayList<ListItem>();
    for (ListItem item: itemsArray) {
        items.add(item);
    }

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

حتى أقصر:

List<Integer> list = Arrays.asList(1, 2, 3, 4);

باستخدام المصفوفات

هذه هي أبسط طريقة لتحويل صفيف إلى List. ومع ذلك ، إذا حاولت إضافة عنصر جديد أو إزالة عنصر موجود من القائمة ، UnsupportedOperationException سيتم إلقاؤه.

Integer[] existingArray = {1, 2, 3};
List<Integer> list1 = Arrays.asList(existingArray);
List<Integer> list2 = Arrays.asList(1, 2, 3);

// WARNING:
list2.add(1);     // Unsupported operation!
list2.remove(1);  // Unsupported operation!

باستخدام ArrayList أو تطبيقات قائمة أخرى

يمكنك استخدام أ for حلقة لإضافة جميع عناصر الصفيف إلى أ List التنفيذ ، على سبيل المثال ArrayList:

List<Integer> list = new ArrayList<>();
for (int i : new int[]{1, 2, 3}) {
  list.add(i);
}

باستخدام دفق API في Java 8

يمكنك تحويل المصفوفة إلى دفق ، ثم جمع الدفق باستخدام جامعي مختلف: المجمع الافتراضي في Java 8 استخدام ArrayList خلف الشاشة ، ولكن يمكنك أيضًا فرض تطبيقك المفضل.

List<Integer> list1, list2, list3;
list1 = Stream.of(1, 2, 3).collect(Collectors.toList());
list2 = Stream.of(1, 2, 3).collect(Collectors.toCollection(ArrayList::new));
list3 = Stream.of(1, 2, 3).collect(Collectors.toCollection(LinkedList::new));

أنظر أيضا:

حل بديل آخر إذا كنت تستخدم Apache Commons-Lang:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(ArrayUtils.toObject(spam));

أين ArrayUtils.toObject المتحولون int[] ل Integer[]

في Java 9 ، لديك الحل الأكثر أناقة لاستخدام القوائم غير القابلة للتغيير عبر طريقة مصنع الراحة الجديدة List.of:

List<String> immutableList = List.of("one","two","three");

(نسخت بلا خجل من هنا )

إذا كنت تستهدف Java 8 (أو لاحقًا) ، فيمكنك تجربة هذا:

int[] numbers = new int[] {1, 2, 3, 4};
List<Integer> integers = Arrays.stream(numbers)
                        .boxed().collect(Collectors.<Integer>toList());

ملاحظة:

انتبه إلى Collectors.<Integer>toList(), ، هذه الطريقة العامة تساعدك على تجنب الخطأ "عدم تطابق النوع: لا يمكن التحويل منه List<Object> ل List<Integer>".

عليك أن تدخل في الصفيف

Arrays.asList((Object[]) array)

خط واحد:

List<Integer> list = Arrays.asList(new Integer[] {1, 2, 3, 4});
  1. باستخدام الجوافة:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = Lists.newArrayList(sourceArray);
    
  2. باستخدام مجموعات Apache Commons:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = new ArrayList<>(6);
    CollectionUtils.addAll(list, array);
    

لذلك يعتمد على إصدار Java الذي تحاول-

جافا 7

 Arrays.asList(1, 2, 3);

أو

       final String arr[] = new String[] { "G", "E", "E", "K" };
       final List<String> initialList = new ArrayList<String>() {{
           add("C");
           add("O");
           add("D");
           add("I");
           add("N");
       }};

       // Elements of the array are appended at the end
       Collections.addAll(initialList, arr);

أو

Integer[] arr = new Integer[] { 1, 2, 3 };
Arrays.asList(arr);

في جافا 8

int[] num = new int[] {1, 2, 3};
List<Integer> list = Arrays.stream(num)
                        .boxed().collect(Collectors.<Integer>toList())

المرجعي - http://www.codingeek.com/java/how-to-convert-array-to-nist-in-java/

إذا كان هذا يساعد: لقد واجهت نفس المشكلة وكتبت ببساطة وظيفة عامة تأخذ صفيفًا وإرجاع قائمة ArrayList من نفس النوع مع نفس المحتويات:

public static <T> ArrayList<T> ArrayToArrayList(T[] array) {
    ArrayList<T> list = new ArrayList<T>();
    for(T elmt : array) list.add(elmt);
    return list;
}

صفيف معطى:

    int[] givenArray = {2,2,3,3,4,5};

تحويل مجموعة عدد صحيح إلى قائمة عدد صحيح

طريقة واحدة: Boxed () -> إرجاع intstream

    List<Integer> givenIntArray1 = Arrays.stream(givenArray)
                                  .boxed()
                                  .collect(Collectors.toList());

الطريقة الثانية: قم بتخطيط كل عنصر من عناصر الدفق إلى عدد صحيح ثم جمع

ملاحظة: باستخدام maptoObj ، يمكنك تغطي كل عنصر من عناصر int في String Stream و SHAR TREAM وما إلى ذلك عن طريق غلاف I TO (char) i

    List<Integer> givenIntArray2 = Arrays.stream(givenArray)
                                         .mapToObj(i->i)
                                         .collect(Collectors.toList());

تحويل نوع صفيف إلى نوع آخر مثال:

List<Character> givenIntArray2 = Arrays.stream(givenArray)
                                             .mapToObj(i->(char)i)
                                             .collect(Collectors.toList());

استخدم سطرين من التعليمات البرمجية لتحويل الصفيف إلى القائمة إذا كنت تستخدمه في قيمة عدد صحيح ، يجب عليك استخدام نوع autoboxing لنوع البيانات البدائية

  Integer [] arr={1,2};
  Arrays.asList(arr);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top