Nasıl int [] Java listesi <Integer> dönüştürmek için?


382

Nasıl dönüştürebilirim int[]içine List<Integer>Java?

Tabii ki, bir döngüde, her bir öğe için yapmaktan başka bir cevapla ilgileniyorum. Ama başka bir cevap yoksa, bu işlevin Java'nın bir parçası olmadığını göstermek için en iyisini seçeceğim.


IntStream.Of (array) .collect (Collectors.toList)
Saroj Kumar Sahoo adlı

Yanıtlar:


259

Aralarından dönüştürmek için hiçbir kısayoldur int[]için List<Integer>olduğu gibi Arrays.asListboks ile uğraşmaz ve sadece yaratacak List<int[]>istediğini olmadığı. Bir yardımcı program yapmak zorundasınız.

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

32
Listeyi dizinin boyutu ile başlatmak en iyisidir
David Rabinowitz

110
(int i: ints) intList.add (i) için;
Stephen Denne

18
@willcodejavaforfood - David bunun daha iyi olduğu anlamına gelir: yeni ArrayList <Integer> (ints.length);
Stephen Denne

12
@willcodejavaforfood: ArrayList'in oluşturulurken boyutunu bildirmek, belirli bir miktar eklendikten sonra dahili olarak yeniden boyutlandırılmasını engeller. Yararın küçük olup olmadığından emin değilim, ama kesinlikle bir fayda var.
Grundlefleck

10
new ArrayList<Integer>() {{ for (int i : ints) add(i); }}
saka1029

350

Canlı Yayınlar

Java 8'de bunu yapabilirsiniz

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

21
Şuna eşdeğerdir: Arrays.stream (ints) .boxed (). Collect (Collectors.toList ());
njfrost

4
@njfrost Haklısınız ve IntStream.of sadece Arrays.stream'i çağırıyor, bu yüzden önerinizi izleyerek cevabı geliştirdim
mikeyreilly

Bazı nedenlerden dolayı bu, Android Studio'da beklenen sonuç türünü döndürmüyor gibi görünüyor (tutulma üzerinde çalışıyor) Beklenen <Integer> Listesi <Object> Listesini buldu.
Eugenio Lopez

Temiz ve özlü görünüyor ama bunu @willcodejavaforfood tarafından leetcode üzerinde sağlanan temel çözümün aksine kullandığımda program performansı hem bellek hem de çalışma süresi
açısından azaldı

@chitreshsirohi, çünkü akışlarda kullanılan lambda işlevleri bazı anonim sınıflar yapmak için Java ile sonuçlanır.
Ashvin Sharma

175

Ayrıca guava kütüphanelerinden ... com.google.common.primitives.Ints:

List<Integer> Ints.asList(int...)

11
Bu doğru cevap olmalı. Sorunun ikinci cümlesine bakın: "Tabii ki, bunu bir döngü halinde yapmaktan başka bir cevapla ilgileniyorum."
josketres

Teşekkürler teşekkürler teşekkürler! Ayrıca Longs.asList (long ...) için de çalışır.
craastad

2
Burada birkaç incelik var. Döndürülen liste, sağlanan diziyi destek deposu olarak kullanır, bu nedenle diziyi değiştirmemelisiniz. Liste ayrıca içerilen Tamsayı nesnelerinin kimliğini garanti etmez. Yani, list.get (0) == list.get (0) sonucu belirtilmez.
pburka

1
Kitaplık eklerken Android'de yöntem referans sayımına dikkat edin. Gerçi iyi bulmak.
milosmlar

95

Arrays.asList diğer cevapların beklediği gibi çalışmaz.

Bu kod olacak değil 10 tamsayılar bir liste oluşturmak. 10 değil 1 yazdıracaktır :

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

Bu bir tamsayı listesi oluşturur:

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

Zaten bir dizi diziniz varsa, dönüştürmenin hızlı bir yolu yoktur, döngüden daha iyi olursunuz.

Öte yandan, dizinizde temel öğeler değil, Nesneler varsa, Arrays.asList çalışacaktır:

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

2
Bu listenin değişmez olduğunu unutmayın
Danielson

51

Farklı bir yöntemle başka bir cevap ekleyeceğim; döngü yok ama otomatik boks özelliklerini kullanacak anonim bir sınıf:

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

1
+1 bu benimkinden daha kısa ama benimki tüm ilkel tipler için çalışıyor
dfa

5
ArrayList oluşturmaktan daha hızlı ve daha az bellek kullanırken, off-list List.add () ve List.remove () çalışmaz.
Stephen Denne

3
Seyrek erişim örüntülerine sahip büyük diziler için bu çözümü oldukça beğendim, ancak sık erişilen öğeler için tamsayı birçok gereksiz örneğiyle sonuçlanır (örneğin, aynı öğeye 100 kez eriştiyseniz). Ayrıca Yineleyiciyi tanımlamanız ve döndürülen değeri Collections.unmodifiableList'e sarmanız gerekir.
Adamski

@Christoffer teşekkürler. setYöntemi ekledim ve şimdi diziyi bile sıralayabilirim ...
freedev

39

En küçük kod parçası:

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

ArrayUtils, commons-lang'den geliyor :)


9
Sadece ArrayUtilsbir Android uygulaması için göreceli büyük bir kütüphane olduğunu unutmayın
msysmilu

Bunun tersi işlem burada açıklanmıştır: stackoverflow.com/a/960507/1333157 ArrayUtils.toPrimitive(...) anahtarıdır.
ZeroOne

26

Akışlı Java 8'de:

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

veya Koleksiyoncularla

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

3
Neden sadece bir koleksiyoncu kullanmıyorsunuz?
assylias

19

Java 8'de:

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

16

Java 8 kullanıyorsanız, akış API'sini bir listeye dönüştürmek için kullanabiliriz.

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

Dönüştürmek için IntStream'i de kullanabilirsiniz.

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

Guava ve apache ortakları gibi diğer harici kütüphaneler de dönüştürülebilir.

şerefe.


11

Ayrıca " Hata değil" ve şu metin ile kapatılan bu hata raporunu da incelemeye değer :

"Tüm dizilerin otomatik olarak bokslanması iyi bir nedenden ötürü belirli bir davranış değildir. Büyük diziler için çok pahalı olabilir."


7

bu sınıfa bir şans verin:

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

test durumu:

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

5

En iyi atış:

**
 * 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;
    }
}
  • Destek alma ve ayarlama.
  • Bellek verisi çoğaltması yok.
  • Döngülerde zaman kaybı yok.

Örnekler:

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

En çok hoşuma gidiyor. Ama hala basit bir çözüm için guava kullanırım :)
dantuch

1

Üçüncü taraf bir kütüphane kullanmaya açıksanız, Eclipse Koleksiyonlarında bu çalışır :

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

Not: Eclipse Collections için bir komisyoncuyum .


1
   /* 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);

1

Peki buna ne dersin:

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


1

İşte bir çözüm:

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

Çıktı:

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

1

Yine Java 8 Streams ile başka bir olasılık daha var:

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

0

Diziyi ArrayList'e dönüştürmenin genel bir yolu

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

kullanım

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

0
int[] arr = { 1, 2, 3, 4, 5 };

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

bkz bu

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.