Frage

Ich habe eine Liste von ganzen zahlen, List<Integer> und ich möchte zu konvertieren alle integer-Objekte in Strings, also dem Abschluss mit einem neuen List<String>.

Natürlich konnte ich erstellen Sie eine neue List<String> und das Durchlaufen der Liste aufrufen String.valueOf() für jede Ganzzahl, aber ich Frage mich, ob es eine bessere (sprich: mehr automatische) Weg, es zu tun?

War es hilfreich?

Lösung

Soweit ich weiß, zu iterieren und zu instanziieren, ist der einzige Weg, dies zu tun.So etwas wie (für die anderen potenziellen helfen, da bin ich mir 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)); 
}

Andere Tipps

Verwendung Google Kollektionen von Guava-Projekt, Sie könnte verwenden die transform Methode 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 List zurückgegeben transform ist ein Ansicht auf der Rückseite list - transformation angewendet werden bei jedem Zugriff auf die transformierte Liste.

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

Lösung für Java 8.Ein bisschen länger als die Guave ein, aber zumindest werden Sie nicht haben die Installation einer Bibliothek.

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

Was du machst, ist in Ordnung, aber wenn Sie das Bedürfnis verspüren, Java-it-up " - Sie könnte verwenden Sie ein Transformator und die sammeln-Methode von Apache Commons, z.B.:

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

Quelle für String.valueOf zeigt dies:

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

Nicht, dass es Angelegenheiten viel, aber ich würde die Verwendung von toString.

Anstelle von String.valueOf ich verwenden würde,.toString();es vermeidet einige der auto-Boxen beschrieben von @johnathan.holland

Der javadoc sagt, dass valueOf gibt die gleiche wie Integer.toString().

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

for (Integer myInt : oldList) { 
  newList.add(myInt.toString()); 
}

Hier ist ein one-liner-Lösung, ohne zu betrügen mit einem nicht-JDK-Bibliothek.

List<String> strings = Arrays.asList(list.toString().replaceAll("\\[(.*)\\]", "$1").split(", "));

Eine andere Lösung mit Guave und Java 8

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<String> strings = Lists.transform(numbers, number -> String.valueOf(number));

Nicht, core Java, und nicht generisch-freundlich, aber der beliebte Jakarta-commons-collections-Bibliothek hat einige nützliche Abstraktionen für diese Art von Aufgabe.Insbesondere haben Sie einen Blick auf die Methoden sammeln

CollectionUtils

Etwas zu beachten, wenn Sie bereits über commons Sammlungen in Ihrem Projekt.

Zu den Menschen, die betroffen sind "Boxen" in jsight Antwort:es gibt keine. String.valueOf(Object) hier verwendet wird, und kein unboxing zu int ist, die jemals durchgeführt.

Egal, ob Sie Integer.toString() oder String.valueOf(Object) hängt auf wie Sie behandeln möchten, möglich, null-Werte.Tun Sie wollen zu werfen eine Ausnahme aus (wahrscheinlich), oder "null" - Strings in der Liste (vielleicht).Wenn die ehemaligen, tun Sie wollen zu werfen NullPointerException oder eine andere Art?

Auch eine kleine Fehler in jsight Antwort: List ist ein interface, Sie können nicht verwenden Sie den new-operator auf.Ich würde wahrscheinlich ein java.util.ArrayList in diesem Fall, vor allem da wir im Vorfeld wissen, wie lange die Liste ist wahrscheinlich zu sein.

@Jonathan:Ich könnte mich irren, aber ich glaube, dass String.valueOf() wird in diesem Fall rufen Sie die String.valueOf(Object) - Funktion, anstatt boxed-zu-String.valueOf(int).String.valueOf(Object) nur gibt "null", wenn es null ist oder Anrufe Objekt.toString() wenn nicht-null, das sollte nicht die Boxen (obwohl offensichtlich instanziieren neue string-Objekte, beteiligt ist).

Ich denke, dass mit dem Objekt.toString() für einen anderen Zweck als debugging ist wahrscheinlich eine wirklich schlechte Idee, auch wenn in diesem Fall die beiden sind funktional äquivalent (vorausgesetzt, die Liste hat keine null-Werte).Entwickler sind frei zu ändern, das Verhalten eines toString () - Methode, ohne jede Warnung, einschließlich die toString () - Methoden aller Klassen in der Standardbibliothek.

Machen Sie sich keine sorgen über die performance-Probleme verursacht durch die boxing/unboxing-Prozess.Wenn die Leistung entscheidend ist, einfach ein array verwenden.Wenn es wirklich kritisch ist, nicht verwenden, wird Java.Versuchen, zu überlisten, die JVM führt das nur zu Herzschmerz.

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

Lambdaj erlaubt zu tun, dass in einer sehr einfachen und lesbaren Art und Weise.Zum Beispiel, angenommen, Sie müssen eine Liste von Integer-und Sie wollen zu konvertieren Sie Sie in die entsprechende String-Darstellung könnten Sie etwas schreiben wie, dass;

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 Konvertierung Funktion nur, während Sie die Iteration auf das Ergebnis.

Sie kann nicht umhin, die "Boxen overhead";Java faux generische Container können nur Objekte speichern, so dass Sie Ihre von ints muss boxed in Ganzzahlen.Im Prinzip könnte es vermeiden, den niedergeschlagenen von Objekt zu Ganzzahl (da es sinnlos ist, weil Objekt ist gut genug für Sie beide String.valueOf und Objekt.toString) aber ich weiß nicht, ob der compiler ist schlau genug, das zu tun.Die Konvertierung von String in Objekt sollte mehr oder weniger ein no-op, so wäre ich nicht das geringste zu befürchten, dass ein.

Nur so zum Spaß, eine Lösung mit der jsr166y fork-join-framework, das JDK7.

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

(Haftungsausschluss:Nicht kompiliert.Spec ist nicht abgeschlossen werden.Etc.)

Unwahrscheinlich, dass in JDK7 ist ein bisschen Typ-Inferenz und syntaktischen Zucker zu machen, dass withMapping rufen weniger ausführlich:

    .withMapping(#(Integer i) String.valueOf(i))

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

Wir haben eine Klasse statische Methoden, speziell zu tun, diese Art von jobs.Da der code für das ist so einfach lassen wir-Hotspot machen die Optimierung für uns.Dies scheint ein Thema in meinem code vor kurzem:schreiben Sie sehr einfach (einfache) code und lassen Hotspot tun seine Magie.Wir haben selten performance-Probleme rund um code wie diesen - wenn Sie eine neue VM-version kommt, erhalten Sie die zusätzliche Geschwindigkeit nutzen etc.

So viel wie ich Liebe Jakarta Sammlungen, keine Unterstützung für Generics und die Verwendung als 1.4 LCD-Display.Ich bin vorsichtig bei der Google-Sammlungen, weil Sie aufgeführt sind, als Alpha-support-level!

Ich sehe keine Lösung, die nach dem Prinzip der Raum Komplexität.Wenn die Liste der ganzen zahlen große Anzahl von Elementen, 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, um 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();
    }

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

Wenn Sie die Modell-domain-Objekte, dann ist die Lösung wird in der domain-Objekte.Die domain ist hier eine Liste von ganzen zahlen, für die wir möchten, dass string-Werte.

Die einfachste Möglichkeit wäre, nicht in der Liste auf alle.

Dass gesagt wird, um zu konvertieren, ohne Sie zu konvertieren, ändern Sie das original-Liste von Integer-Liste Wert, wobei Wert 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 als das kopieren der Liste.

Viel Glück!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top