Konvertieren von List <Integer> zur Liste <String>

stimmen
86

Ich habe eine Liste von ganzen Zahlen, List<Integer>und ich möchte all Integer - Objekte in Strings konvertieren, so dass mit einem neuen Finishing List<String>.

Natürlich könnte ich eine neue erstellen List<String>und Schleife durch die Liste Aufruf String.valueOf()für jede ganze Zahl, aber ich habe mich gefragt , ob es eine bessere war (sprich: mehr Automatik ) Art und Weise , es zu tun?

Veröffentlicht am 20/08/2008 um 19:29
quelle vom benutzer
In anderen Sprachen...                            


19 antworten

stimmen
83

Mit Google Kollektionen von Guava-Projekt , können Sie die Verwendung transformMethode in der Listen - Klasse

import com.google.common.collect.Lists;
import com.google.common.base.Functions

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

List<String> strings = Lists.transform(integers, Functions.toStringFunction());

Die Listzurückgeführt, indem transformeine Ansicht auf der Trägerliste - die Transformation wird bei jedem Zugriff auf die transformierte Liste angewandt werden.

Beachten Sie, dass Functions.toStringFunction()eine werfen wird , NullPointerExceptionwenn auf null angewandt, so dass es nur verwenden , wenn Sie sicher sind , dass Ihre Liste nicht null enthalten.

Beantwortet am 04/08/2009 um 13:04
quelle vom benutzer

stimmen
66

Soweit ich weiß, iterieren und instantiate ist der einzige Weg, dies zu tun. So etwas wie (für andere mögliche Hilfe, da ich bin sicher, dass Sie wissen, wie dies zu tun):

List<Integer> oldList = ...
/* Specify the size of the list up front to prevent resizing. */
List<String> newList = new ArrayList<String>(oldList.size()) 
for (Integer myInt : oldList) { 
  newList.add(String.valueOf(myInt)); 
}
Beantwortet am 20/08/2008 um 19:34
quelle vom benutzer

stimmen
55

Lösung für Java 8. Ein bisschen länger als die Guava ein, aber zumindest Sie müssen nicht eine Bibliothek installieren.

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

//...

List<Integer> integers = Arrays.asList(1, 2, 3, 4);
List<String> strings = integers.stream().map(Object::toString)
                                        .collect(Collectors.toList());
Beantwortet am 12/04/2014 um 00:52
quelle vom benutzer

stimmen
39

Was Sie tun , ist in Ordnung, aber wenn Sie das Bedürfnis verspüren, ‚Java-it-up‘ Sie verwenden könnten Transformator und die collect Methode von Apache Commons , zB:

public class IntegerToStringTransformer implements Transformer<Integer, String> {
   public String transform(final Integer i) {
      return (i == null ? null : i.toString());
   }
}

..und dann..

CollectionUtils.collect(
   collectionOfIntegers, 
   new IntegerToStringTransformer(), 
   newCollectionOfStrings);
Beantwortet am 21/08/2008 um 02:24
quelle vom benutzer

stimmen
9

Die Quelle für String.valueOf zeigt dies:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

Nicht, dass es wichtig ist viel, aber ich würde toString verwenden.

Beantwortet am 20/08/2008 um 20:03
quelle vom benutzer

stimmen
9

Stattdessen String.valueOf die Verwendung würde ich verwenden .toString (); es vermeidet einige der Auto-Boxen beschrieben durch @ johnathan.holland

Die javadoc sagt, dass valueOf das gleiche wie Integer.toString () gibt.

List<Integer> oldList = ...
List<String> newList = new ArrayList<String>(oldList.size());

for (Integer myInt : oldList) { 
  newList.add(myInt.toString()); 
}
Beantwortet am 20/08/2008 um 19:45
quelle vom benutzer

stimmen
8

Hier ist eine Einzeiler Lösung mit einer nicht-JDK-Bibliothek, ohne zu betrügen.

List<String> strings = Arrays.asList(list.toString().replaceAll("\\[(.*)\\]", "$1").split(", "));
Beantwortet am 25/04/2011 um 19:42
quelle vom benutzer

stimmen
5

Eine andere Lösung mit Guava und Java 8

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<String> strings = Lists.transform(numbers, number -> String.valueOf(number));
Beantwortet am 25/04/2014 um 13:38
quelle vom benutzer

stimmen
3

Um die Menschen besorgt über „Boxen“ in jsight Antwort: Gibt es keine. String.valueOf(Object)hier, und kein Unboxing zu verwendet , intwird immer ausgeführt.

Egal , ob Sie Integer.toString()oder String.valueOf(Object)hängt davon ab , wie Sie mögliche Nullen behandeln möchten. Sie möchten eine Ausnahme (wahrscheinlich) werfen, oder haben „null“ Strings in der Liste (vielleicht). Wenn der ehemalige, tun Sie werfen wollen NullPointerExceptionoder eine andere Art?

Auch ein kleiner Fehler in jsight Antwort: Listist eine Schnittstelle, Sie nicht die neuen Betreiber auf sie verwenden können. Ich würde wahrscheinlich eine Verwendung java.util.ArrayListin diesem Fall vor allem , da wir wissen , vorne , wie lange die Liste wahrscheinlich zu sein.

Beantwortet am 28/08/2008 um 19:35
quelle vom benutzer

stimmen
3

Nicht Kern Java, und nicht generic-ified, aber die populäre commons Sammlungen Bibliothek Jakarta hat einige nützliche Abstraktionen für diese Art von Aufgabe. Insbesondere hat einen Blick auf den collect Methoden auf

CollectionUtils

Etwas zu prüfen, wenn Sie bereits commons Sammlungen in Ihrem Projekt.

Beantwortet am 20/08/2008 um 21:26
quelle vom benutzer

stimmen
2

Lambdaj ermöglicht , dass in einer sehr einfachen und gut lesbare Art und Weise zu tun. Zum Beispiel, angenommen , Sie eine Liste von Integer haben , und Sie wollen , dass sie in der entsprechenden String - Darstellung konvertieren man so etwas schreiben konnte;

List<Integer> ints = asList(1, 2, 3, 4);
Iterator<String> stringIterator = convertIterator(ints, new Converter<Integer, String> {
    public String convert(Integer i) { return Integer.toString(i); }
}

Lambdaj gilt die Konvertierungsfunktion nur, während Sie auf das Ergebnis sind laufen.

Beantwortet am 07/03/2010 um 13:40
quelle vom benutzer

stimmen
2

Eine Antwort nur für Experten:

    List<Integer> ints = ...;
    String all = new ArrayList<Integer>(ints).toString();
    String[] split = all.substring(1, all.length()-1).split(", ");
    List<String> strs = Arrays.asList(split);
Beantwortet am 11/09/2008 um 21:40
quelle vom benutzer

stimmen
2

Ich denke, mit Object.toString () für einen anderen Zweck als das Debuggen ist wahrscheinlich eine wirklich schlechte Idee, wenn auch in diesem Fall der beide funktionell gleichwertig sind (die Liste unter der Annahme hat keine Nullen). Entwickler können das Verhalten von jeder Methode toString () ohne Vorwarnung zu ändern, einschließlich dem toString () Methoden aller Klassen in der Standardbibliothek.

Sorgen Sie sich nicht einmal über die Performance-Probleme durch die Boxen / Unboxing-Prozess verursacht. Wenn die Leistung entscheidend ist, nur ein Array verwenden. Wenn es wirklich kritisch ist, verwenden Sie Java nicht. Der Versuch, die JVM auszutricksen wird nur Kummer führen.

Beantwortet am 20/08/2008 um 19:53
quelle vom benutzer

stimmen
2

@ Jonathan: Ich könnte falsch sein, aber ich glaube, dass String.valueOf () in diesem Fall wird die String.valueOf (Object) Funktion aufrufen, anstatt zu String.valueOf geboxt zu werden (int). String.valueOf (Object) gibt nur „null“, wenn es null ist oder ruft Object.toString (), wenn nicht null, was nicht Boxen beinhalten sollte (obwohl offensichtlich neue String-Objekte instanziieren beteiligt ist).

Beantwortet am 20/08/2008 um 19:42
quelle vom benutzer

stimmen
1

Sie können nicht den „Box-Overhead“ vermeiden; Java Faux generische Container können nur Objekte speichern, so muss Ihr Ints in ganzen Zahlen verpackt werden. Im Prinzip könnte es die gesenkten von Objekt zu Integer vermeiden (da es sinnlos ist, weil Objekt für beide String.valueOf und Object.toString gut genug ist), aber ich weiß nicht, ob der Compiler ist intelligent genug, das zu tun. Die Umwandlung von String-Objekt sollte mehr oder weniger eine no-op, so würde ich mich über, dass man sich Sorgen zu machen abgeneigt sein.

Beantwortet am 20/08/2008 um 21:25
quelle vom benutzer

stimmen
0

Ich habe keine Lösung, die das Prinzip der Speicherkomplexität folgt. Wenn die Liste der ganzen Zahlen große Anzahl von Elementen hat, dann ist es großes Problem.

It will be really good to remove the integer from the List<Integer> and free
the space, once it's added to List<String>.

Wir können Iterator verwenden das gleiche zu erreichen.

    List<Integer> oldList = new ArrayList<>();
    oldList.add(12);
    oldList.add(14);
    .......
    .......

    List<String> newList = new ArrayList<String>(oldList.size());
    Iterator<Integer> itr = oldList.iterator();
    while(itr.hasNext()){
        newList.add(itr.next().toString());
        itr.remove();
    }
Beantwortet am 29/08/2017 um 16:27
quelle vom benutzer

stimmen
0

Dies ist eine so grundlegende Sache, die ich eine externe Bibliothek verwenden würde nicht zu tun (es wird eine Abhängigkeit in Ihrem Projekt verursacht, die wahrscheinlich nicht brauchen).

Wir haben eine Klasse von statischen Methoden speziell diese Art von Arbeit zu tun gefertigt. Da der Code für das so einfach ist, wir lassen Hotspot für uns die Optimierung tun. Dies scheint vor kurzem ein Thema in meinem Code zu sein: Schreiben sehr einfach (einfach) Code und läßt Hotspot seine Magie tun. Wir haben selten Performance-Probleme um Code wie folgt - wenn eine neue VM-Version kommt entlang Sie alle zusätzlichen Geschwindigkeitsvorteile usw. erhalten

So viel wie ich Jakarta Sammlungen lieben, sie unterstützen Generics nicht und 1.4 als LCD verwenden. Ich bin vorsichtig bei Google Kollektionen, weil sie als Alpha Support-Level aufgeführt sind!

Beantwortet am 24/09/2008 um 08:27
quelle vom benutzer

stimmen
0

Just for fun, eine Lösung, die die jsr166y mit Gabel-Join-Framework, das in JDK7 sollte.

import java.util.concurrent.forkjoin.*;

private final ForkJoinExecutor executor = new ForkJoinPool();
...
List<Integer> ints = ...;
List<String> strs =
    ParallelArray.create(ints.size(), Integer.class, executor)
    .withMapping(new Ops.Op<Integer,String>() { public String op(Integer i) {
        return String.valueOf(i);
    }})
    .all()
    .asList();

(Disclaimer:. Nicht kompilierte Spec nicht abgeschlossen Etc.).

Unwahrscheinlich in JDK7 zu sein, ist ein bisschen Typinferenz und syntaktischen Zucker, dass withMapping Anruf weniger ausführlich zu machen:

    .withMapping(#(Integer i) String.valueOf(i))
Beantwortet am 14/09/2008 um 22:25
quelle vom benutzer

stimmen
-1

Ich wollte nur mit einer objektorientierten Lösung für das Problem läuten.

Wenn Sie Domänenobjekte modellieren, dann ist die Lösung in den Domänenobjekten. Die Domain ist hier eine Liste von ganzen Zahlen, für die wir String-Werte werden sollen.

Der einfachste Weg wäre, überhaupt nicht um die Liste zu konvertieren.

Davon abgesehen, um ohne Konvertierung zu konvertieren, die ursprüngliche Liste von Integer Wertänderung zur Liste, wo Wert ungefähr so ​​aussieht ...

class Value {
    Integer value;
    public Integer getInt()
    {
       return value;
    }
    public String getString()
    {
       return String.valueOf(value);
    }
}

Dies wird schneller sein und weniger Speicher benötigen als die Liste zu kopieren.

Viel Glück!

Beantwortet am 07/09/2012 um 18:40
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more