Wie kann ich List konvertieren zu int[] auf Java? [duplicate]

Lesezeit: 7 Minuten

Ich bin Java-Neuling. Wie kann ich eine konvertieren List<Integer> zu int[] auf Java?

Ich bin verwirrt, weil List.toArray() gibt tatsächlich eine zurück Object[]die zu keinem von beiden gecastet werden kann Integer[] Noch int[].

Im Moment verwende ich dazu eine Schleife:

int[] toIntArray(List<Integer> list) {
  int[] ret = new int[list.size()];
  for(int i = 0; i < ret.length; i++)
    ret[i] = list.get(i);
  return ret;
}

Gibt es einen besseren Weg, dies zu tun?

Dies ist ähnlich wie die Frage
Wie kann ich int umwandeln?[] zu Ganzzahl[] auf Java?.

  • Sie können nur in Integer umwandeln[] durch die Nutzung: Integer[] arr = (Integer[])list.toArray(new Integer[list.size]);

    – Fest codiert

    5. Juli 2010 um 15:48 Uhr

  • @Hardcoded Möglicherweise möchten Sie Ihren Kommentar bearbeiten, um die Methode list.size() zu verwenden und die unnötige Umwandlung zu löschen.

    – saktiw

    9. April 2013 um 16:10 Uhr


  • Gibt es eine bessere Möglichkeit, dies jetzt in Java 8 zu tun?

    – Makoto

    16. Juni 2014 um 0:14 Uhr

  • (@Makoto: siehe Pshemos Antwort)

    – Graubart

    9. Februar 2016 um 19:11 Uhr

  • int[] arr = listOfIntegers.stream().mapToInt(x->x).toArray();

    – old_soul_on_the_run

    22. September 2018 um 23:49 Uhr

Wie kann ich List konvertieren zu int auf Java duplicate
Pshemo

Niemand hat bisher in Java 8 hinzugefügte Streams erwähnt, also hier ist es:

int[] example1 = list.stream().mapToInt(i->i).toArray();
// OR
int[] example2 = list.stream().mapToInt(Integer::intValue).toArray();

Denkprozess:

  • Das Einfache Stream#toArray gibt ein zurück Object[] Array, also ist es nicht das, was wir wollen. Ebenfalls, Stream#toArray(IntFunction<A[]> generator) tut nicht, was wir wollen, weil der generische Typ A kann den primitiven Typ nicht darstellen int

  • Es wäre also schön, einen Stream zu haben, der mit dem primitiven Typ umgehen könnte int anstelle der Verpackung Integerweil es toArray -Methode wird höchstwahrscheinlich auch eine zurückgeben int[] array (gibt etwas anderes zurück wie Object[] oder sogar verpackt Integer[] wäre hier unnatürlich). Und zum Glück hat Java 8 einen solchen Stream, der ist IntStream

  • Jetzt müssen wir nur noch herausfinden, wie wir unsere umwandeln Stream<Integer> (was zurückgegeben wird von list.stream()) zu diesem glänzenden IntStream. Hier die Stream#mapToInt(ToIntFunction<? super T> mapper) Methode kommt zur Rettung. Alles, was wir tun müssen, ist, ihm ein Mapping von zu übergeben Integer zu int.

    Wir könnten so etwas gebrauchen Integer#intValue was ein zurückgibt int Wie nachfolgend dargestellt:

    mapToInt( (Integer i) -> i.intValue() )  
    

    (oder einige mögen es vorziehen: mapToInt(Integer::intValue).)

    Aber ähnlicher Code kann mit Unboxing generiert werden, da der Compiler weiß, dass das Ergebnis dieses Lambda vom Typ sein muss int (das verwendete Lambda in mapToInt ist eine Implementierung der ToIntFunction Schnittstelle, die als Körper eine Methode des Typs erwartet: int applyAsInt(T value) die voraussichtlich eine zurückgeben wird int).

    Wir können also einfach schreiben:

    mapToInt((Integer i)->i)
    

    Auch seit dem Integer eintippen (Integer i) kann vom Compiler abgeleitet werden, weil List<Integer>#stream() gibt a zurück Stream<Integer>wir können es auch überspringen, was uns übrig lässt

    mapToInt(i -> i)
    

  • Ganz klar die beste Lösung. Schade, dass es an Erklärungen mangelt.

    – Pimp Trizkit

    26. November 2015 um 14:53 Uhr


  • @PimpTrizkit Diese Antwort wurde ein wenig aktualisiert. Hoffe es ist jetzt klarer.

    – Pschemo

    26. November 2015 um 15:32 Uhr

  • @Pshemo – Danke! Ich persönlich brauchte keine Erklärung. Aber ich hasse es, die perfekte Antwort ohne eine zu sehen! Unabhängig davon hat mich Ihre Erklärung aufgeklärt und war hilfreich. Ich frage mich, warum die mapTo... Funktionen nicht zulassen null lambda …. wie sort …. was es standardmäßig zu einem Standardverhalten macht … in diesem Fall i -> i wäre ein perfektes Standardverhalten.

    – Pimp Trizkit

    27. November 2015 um 3:29 Uhr

  • Ich denke, diese Antwort ist schneller als ColinDs Antwort mit Guava, oder?

    – vefthym

    2. März 2017 um 10:47 Uhr


  • @vefthym Ich habe es nicht getestet, aber ich vermute, dass beide Lösungen nach demselben einfachen Prinzip funktionieren, sodass ich eine ähnliche Geschwindigkeit erwarten würde (aber Sie können es gerne als Benchmark verwenden). Ein Vorteil dieser Antwort ist, dass keine zusätzlichen Bibliotheken erforderlich sind, solange wir Java 8 haben.

    – Pschemo

    2. März 2017 um 15:55 Uhr


Leider glaube ich da nicht wirklich ist eine bessere Möglichkeit, dies zu tun, da Java primitive Typen, Boxing, Arrays und Generika handhabt. Bestimmtes:

  • List<T>.toArray funktioniert nicht, weil es keine Konvertierung von gibt Integer zu int
  • Sie können nicht verwenden int als Typargument für Generika, so würde es verfügen über ein … sein int-spezifische Methode (oder eine, die Reflexion verwendet, um böse Tricks zu machen).

Ich glaube, es gibt Bibliotheken, die automatisch generierte Versionen dieser Art von Methode für alle primitiven Typen haben (dh es gibt eine Vorlage, die für jeden Typ kopiert wird). Es ist hässlich, aber ich fürchte, es ist so 🙁

Obwohl die Arrays Klasse herauskam, bevor Generika in Java ankamen, müsste sie immer noch all die schrecklichen Überladungen enthalten, wenn sie heute eingeführt würde (vorausgesetzt, Sie wollen primitive Arrays verwenden).

  • Siehe auch ColinDs Antwort zu Guavas Ints.toArray(Collection)

    – Ron

    16. Juni 2011 um 12:34 Uhr

  • @JonSkeet du meinst wie die schrecklichen Überladungen, die bereits in der Arrays-Klasse vorhanden sind binarySearch, copyOf, copyOfRange…? Ich frage mich, warum sie nicht einen weiteren Satz schrecklicher Überladungen hinzufügen konnten.

    – Simon Forsberg

    24. Mai 2013 um 20:30 Uhr

  • Die Antwort von @ron ColinD gibt nichts anderes als das, was das OP bereits hatte – For-Schleife zum Füllen eines primitiven Arrays mit einem nicht primitiven.

    – Tomáš Zato – Wiedereinsetzung von Monica

    6. März 2015 um 19:47 Uhr

  • Inzwischen sind Java-Ingenieure bei Oracle darauf fixiert, die Sprache mit Modulen zu verkomplizieren …

    – Gubatron

    17. Februar 2016 um 20:41 Uhr

  • @bvdb: Ich sage, dass es ohne andere Bibliotheken (die im Grunde immer noch die Schleife haben, aber in ihrem Code nicht Ihren) keinen besseren Ansatz gibt. Das ist eine deutlich stärkere Behauptung als zu sagen, ich weiß nicht, ob es einen besseren Ansatz gibt oder nicht.

    – Jon Skeet

    20. Juni 2016 um 13:50 Uhr

Wie kann ich List konvertieren zu int auf Java duplicate
ColinD

Zusätzlich zu Commons Lang können Sie dies mit tun Guave‘s Methode Ints.toArray(Collection<Integer> collection):

List<Integer> list = ...
int[] ints = Ints.toArray(list);

Dies erspart Ihnen die zwischenzeitliche Array-Konvertierung, die das Commons Lang-Äquivalent selbst erfordert.

  • Leider ist das Zwischenarray in Guava versteckt: Object[] boxedArray = collection.toArray();

    – kamczak

    25. Februar 2014 um 12:05 Uhr


  • “Glücklicherweise ist die Zwischenreihe in Guava versteckt.” – Das wurde für Sie behoben. 😉

    – Erbaut

    5. August 2016 um 21:03 Uhr


1647270431 330 Wie kann ich List konvertieren zu int auf Java duplicate
Eddi

Der einfachste Weg, dies zu tun, ist die Verwendung von Apache Commons Lang. Es hat eine praktische ArrayUtils-Klasse, die tun kann, was Sie wollen. Verwenden Sie die toPrimitive -Methode mit der Überladung für ein Array von IntegerS.

List<Integer> myList;
 ... assign and fill the list
int[] intArray = ArrayUtils.toPrimitive(myList.toArray(new Integer[myList.size()]));

So erfindet man das Rad nicht neu. Commons Lang hat sehr viele nützliche Dinge, die Java weggelassen hat. Oben habe ich mich entschieden, eine Integer-Liste der richtigen Größe zu erstellen. Sie können auch ein statisches Integer-Array der Länge 0 verwenden und Java ein Array der richtigen Größe zuweisen lassen:

static final Integer[] NO_INTS = new Integer[0];
   ....
int[] intArray2 = ArrayUtils.toPrimitive(myList.toArray(NO_INTS));

1647270431 568 Wie kann ich List konvertieren zu int auf Java duplicate
Pumpenhaus

Java 8 hat uns eine einfache Möglichkeit gegeben, dies über Streams zu tun …

Verwendung der Sammlungen stream() -Funktion und dann auf ints abbilden, erhalten Sie einen IntStream. Mit dem IntStream wir können toArray() aufrufen, was uns gibt int []

int [] ints = list.stream().mapToInt(Integer::intValue).toArray();

zu int []

zu IntStream

Wie kann ich List konvertieren zu int auf Java duplicate
Cheok Yan Cheng

int[] toIntArray(List<Integer> list)  {
    int[] ret = new int[list.size()];
    int i = 0;
    for (Integer e : list)  
        ret[i++] = e;
    return ret;
}

Leichte Änderung an Ihrem Code, um eine teure Listenindizierung zu vermeiden (da eine Liste nicht unbedingt eine ArrayList ist, sondern eine verkettete Liste sein könnte, für die wahlfreier Zugriff teuer ist)

1647270432 706 Wie kann ich List konvertieren zu int auf Java duplicate
Noor Nawaz

Hier ist Java 8 einzeiliger Code dafür

public int[] toIntArray(List<Integer> intList){
       return intList.stream().mapToInt(Integer::intValue).toArray();
}

1002030cookie-checkWie kann ich List konvertieren zu int[] auf Java? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy