سؤال

كيف أقوم بالتحويل int[] داخل List<Integer> في جاوة؟

بالطبع، أنا مهتم بأي إجابة أخرى غير القيام بذلك في حلقة، عنصرًا تلو الآخر.ولكن إذا لم تكن هناك إجابة أخرى، فسأختارها باعتبارها الأفضل لإظهار حقيقة أن هذه الوظيفة ليست جزءًا من Java.

هل كانت مفيدة؟

المحلول

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

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

نصائح أخرى

تحليل تيارات

في جاوة 8 يمكنك القيام بذلك

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

وسوف Arrays.asList لا تعمل كما بعض الإجابات أخرى تتوقع.

وهذا الرمز سوف على لا إنشاء قائمة من 10 الأعداد الصحيحة. وسوف طباعة على 1 ، أو لا على 10 : ل

int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
List lst = Arrays.asList(arr);
System.out.println(lst.size());

وهذا سيتم إنشاء قائمة من الأعداد الصحيحة:

List<Integer> lst = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

إذا كان لديك بالفعل مجموعة من [إينتس]، وليس هناك طريقة سريعة لتحويل، كنت أفضل حالا مع الحلقة.

ومن ناحية أخرى، إذا كان لديه مجموعة كائنات، وليس الأوليات في ذلك، وسوف Arrays.asList العمل:

String str[] = { "Homer", "Marge", "Bart", "Lisa", "Maggie" };
List<String> lst = Arrays.asList(str);

وسأضيف إجابة أخرى مع طريقة مختلفة. لا حلقة ولكن فئة مجهولة المصدر التي من شأنها الاستفادة من الميزات autoboxing:

public List<Integer> asList(final int[] is)
{
    return new AbstractList<Integer>() {
            public Integer get(int i) { return is[i]; }
            public int size() { return is.length; }
    };
}

وأصغر قطعة من التعليمات البرمجية سيكون:

public List<Integer> myWork(int[] array) {
    return Arrays.asList(ArrayUtils.toObject(array));
}

وحيث ArrayUtils يأتي من العموم لانغ:)

في جاوة 8 مع تيار:

int[] ints = {1, 2, 3};
List<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, Arrays.stream(ints).boxed().toArray(Integer[]::new));

وأو مع جامعي

List<Integer> list =  Arrays.stream(ints).boxed().collect(Collectors.toList());

في جاوة 8:

int[] arr = {1,2,3};
IntStream.of(arr).boxed().collect(Collectors.toList());

وكما انها تستحق التدقيق بها هذا التقرير علة ، التي كانت مغلقة مع السبب "ليس عيبا" والنص التالي:

و"Autoboxing صفائف كامل لم يتم تحديد السلوك، لسبب وجيه. يمكن أن يكون مكلفا للغاية لصفائف كبيرة ".

وتعطي في محاولة لهذه الفئة:

class PrimitiveWrapper<T> extends AbstractList<T> {

    private final T[] data;

    private PrimitiveWrapper(T[] data) {
        this.data = data; // you can clone this array for preventing aliasing
    }

    public static <T> List<T> ofIntegers(int... data) {
        return new PrimitiveWrapper(toBoxedArray(Integer.class, data));
    }

    public static <T> List<T> ofCharacters(char... data) {
        return new PrimitiveWrapper(toBoxedArray(Character.class, data));
    }

    public static <T> List<T> ofDoubles(double... data) {
        return new PrimitiveWrapper(toBoxedArray(Double.class, data));
    }  

    // ditto for byte, float, boolean, long

    private static <T> T[] toBoxedArray(Class<T> boxClass, Object components) {
        final int length = Array.getLength(components);
        Object res = Array.newInstance(boxClass, length);

        for (int i = 0; i < length; i++) {
            Array.set(res, i, Array.get(components, i));
        }

        return (T[]) res;
    }

    @Override
    public T get(int index) {
        return data[index];
    }

    @Override
    public int size() {
        return data.length;
    }
}

وtestcase:

List<Integer> ints = PrimitiveWrapper.ofIntegers(10, 20);
List<Double> doubles = PrimitiveWrapper.ofDoubles(10, 20);
// etc

أفضل لقطة:

**
 * Integer modifiable fix length list of an int array or many int's.
 *
 * @author Daniel De Leon.
 */
public class IntegerListWrap extends AbstractList<Integer> {

    int[] data;

    public IntegerListWrap(int... data) {
        this.data = data;
    }

    @Override
    public Integer get(int index) {
        return data[index];
    }

    @Override
    public Integer set(int index, Integer element) {
        int r = data[index];
        data[index] = element;
        return r;
    }

    @Override
    public int size() {
        return data.length;
    }
}
  • الحصول على الدعم وتعيين.
  • لا يوجد تكرار لبيانات الذاكرة.
  • عدم إضاعة الوقت في الحلقات.

أمثلة:

int[] intArray = new int[]{1, 2, 3};
List<Integer> integerListWrap = new IntegerListWrap(intArray);
List<Integer> integerListWrap1 = new IntegerListWrap(1, 2, 3);

إذا كنت تستخدم جافا 8، يمكننا استخدام API تيار لتحويله إلى القائمة.

List<Integer> list = Arrays.stream(arr)     // IntStream 
                                .boxed()        // Stream<Integer>
                                .collect(Collectors.toList());

ويمكنك أيضا استخدام IntStream لتحويل كذلك.

List<Integer> list = IntStream.of(arr) // return Intstream
                                    .boxed()        // Stream<Integer>
                                    .collect(Collectors.toList());

وهناك مكتبة خارجية أخرى مثل الجوافة واباتشي العموم  تتوفر أيضا تحويله.

والهتافات.

إذا كنت مفتوحة للاستخدام مكتبة طرف ثالث، وهذا سيعمل في مجموعات الكسوف :

int[] a = {1, 2, 3};
List<Integer> integers = IntLists.mutable.with(a).collect(i -> i);
Assert.assertEquals(Lists.mutable.with(1, 2, 3), integers);

ملحوظة: أنا مرتكب ل مجموعات الكسوف

   /* Integer[] to List<Integer> */



        Integer[] intArr = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
        List<Integer> arrList = new ArrayList<>();
        arrList.addAll(Arrays.asList(intArr));
        System.out.println(arrList);


/* Integer[] to Collection<Integer> */


    Integer[] intArr = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
    Collection<Integer> c = Arrays.asList(intArr);

وماذا عن هذا:

وint[] a = {1,2,3}; Integer[] b = ArrayUtils.toObject(a); List<Integer> c = Arrays.asList(b);

وهنا هو الحل:

int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

Integer[] iArray = Arrays.stream(array).boxed().toArray(Integer[]::new);
System.out.println(Arrays.toString(iArray));

List<Integer> list = new ArrayList<>();
Collections.addAll(list, iArray);
System.out.println(list);

وإخراج:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

إليك احتمال آخر، مرة أخرى مع Java 8 Streams:

void intArrayToListOfIntegers(int[] arr, List<Integer> list) {
    IntStream.range(0, arr.length).forEach(i -> list.add(arr[i]));
}

وهنا هو وسيلة عامة لتحويل مجموعة إلى ArrayList

<T> ArrayList<T> toArrayList(Object o, Class<T> type){
    ArrayList<T> objects = new ArrayList<>();
    for (int i = 0; i < Array.getLength(o); i++) {
        //noinspection unchecked
        objects.add((T) Array.get(o, i));
    }
    return objects;
}
<ع> الاستخدام

ArrayList<Integer> list = toArrayList(new int[]{1,2,3}, Integer.class);

وأنا أتساءل عما إذا كان شيء ما على غرار Arrays.asList(...array) ستعمل ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top