it-swarm.com.de

Konvertieren Sie Liste <String> direkt in Liste <Ganzzahl>

Nach dem Parsen enthält meine Datei "s" AttributeGet:1,16,10106,10111 

Ich muss also alle Zahlen nach dem Doppelpunkt in der attributeIDGet-Liste erhalten. Ich weiß, dass es mehrere Möglichkeiten gibt, dies zu tun. Aber gibt es eine Möglichkeit, Direktes Konvertieren von List<String> in List<Integer>. Da der folgende Code über Typenkonflikt klagt, habe ich versucht, die Integer.parseInt zu erstellen, aber ich denke, das funktioniert nicht für List . Hier ist String.

private static List<Integer> attributeIDGet = new ArrayList<Integer>();

if(s.contains("AttributeGet:")) {
    attributeIDGet = Arrays.asList(s.split(":")[1].split(","));
}
49
AKIWEB

Nein, Sie müssen das Array durchlaufen

for(String s : strList) intList.add(Integer.valueOf(s));
60
Kevin

Verwendung von Java8:

stringList.stream().map(Integer::parseInt).collect(Collectors.toList());
44
Dawid Stępień

Verwendung von Lambda:

strList.stream().map(org.Apache.commons.lang3.math.NumberUtils::toInt).collect(Collectors.toList());

9
Tadeu Jr.

Guava Converters mach den Trick.

import com.google.common.base.Splitter;
import com.google.common.primitives.Longs;

final Iterable<Long> longIds = 
    Longs.stringConverter().convertAll(
        Splitter.on(',').trimResults().omitEmptyStrings()
            .splitToList("1,2,3"));
9

Nein, Sie müssen jedes Element durchlaufen:

for(String number : numbers) {
   numberList.add(Integer.parseInt(number)); 
}

Der Grund dafür ist, dass es keinen einfachen Weg gibt, eine Liste eines Typs in jeden anderen Typ zu konvertieren. Einige Konvertierungen sind nicht möglich oder müssen auf bestimmte Weise durchgeführt werden. Die Konvertierung hängt im Wesentlichen von den beteiligten Objekten und dem Kontext der Konvertierung ab, so dass es keine "one size fits all" -Lösung gibt. Was wäre beispielsweise, wenn Sie ein Car-Objekt und ein Person-Objekt hätten. Sie können einen List<Car> nicht direkt in einen List<Person> konvertieren, da dies nicht wirklich sinnvoll ist.

8
Vivin Paliath

Wenn Sie Google Guava-Bibliothek verwenden können Sie dies tun, siehe Listen # transform

    String s = "AttributeGet:1,16,10106,10111";


    List<Integer> attributeIDGet = new ArrayList<Integer>();

    if(s.contains("AttributeGet:")) {
        List<String> attributeIDGetS = Arrays.asList(s.split(":")[1].split(","));
        attributeIDGet =
        Lists.transform(attributeIDGetS, new Function<String, Integer>() {
            public Integer apply(String e) {
                return Integer.parseInt(e);
            };
        });
    }

Ja, ich stimme der obigen Antwort zu: Das ist aufgebläht, aber stilvoll. Aber es ist nur ein anderer Weg.

7
Nishant

Warum konvertieren Sie die Liste der Zeichenfolgen nicht in eine Liste der ganzen Zahlen mithilfe von Stream?

List<String> stringList = new ArrayList<String>(Arrays.asList("10", "30", "40",
            "50", "60", "70"));
List<Integer> integerList = stringList.stream()
            .map(Integer::valueOf).collect(Collectors.toList());

komplette Operation könnte so etwas sein

String s = "AttributeGet:1,16,10106,10111";
List<Integer> integerList = (s.startsWith("AttributeGet:")) ?
    Arrays.asList(s.replace("AttributeGet:", "").split(","))
    .stream().map(Integer::valueOf).collect(Collectors.toList())
    : new ArrayList<Integer>();
4
Morteza Adi

Wenn Sie Lambdas aus Java 8 verwenden dürfen, können Sie das folgende Codebeispiel verwenden.

final String text = "1:2:3:4:5";
final List<Integer> list = Arrays.asList(text.split(":")).stream()
  .map(s -> Integer.parseInt(s))
  .collect(Collectors.toList());
System.out.println(list);

Keine Verwendung externer Bibliotheken. Einfach alt neues Java!

3
javatarz

Sie können die Lambda-Funktionen von Java 8 verwenden, um dies ohne Schleifen zu erreichen

    String string = "1, 2, 3, 4";
    List<Integer> list = Arrays.asList(string.split(",")).stream().map(s -> Integer.parseInt(s.trim())).collect(Collectors.toList());
2
virag

Nein, es gibt keine Möglichkeit (das weiß ich) in Java.

Grundsätzlich müssen Sie jeden Eintrag von String in Integer umwandeln.

Das, wonach Sie suchen, könnte in einer funktionaleren Sprache erreicht werden, in der Sie eine Transformationsfunktion übergeben und auf jedes Element der Liste anwenden können. Dies ist jedoch nicht möglich (es gilt immer noch für jedes Element in der Liste.) ).

Overkill:

Sie können jedoch eine Funktion von Google Guava (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Function.html) verwenden, um einen funktionalen Ansatz zu simulieren, falls dies der Fall ist ist was Sie suchen.

Wenn Sie sich Sorgen machen, zweimal über die Liste zu iterieren, verwenden Sie anstelle von Split einen Tokenizer und wandeln Sie jedes Ganzzahl-Token in Ganzzahl um, bevor Sie es der Liste hinzufügen.

1
pcalcao

Streams und Lambda verwenden:

newIntegerlist = listName.stream().map(x-> 
    Integer.valueOf(x)).collect(Collectors.toList());

Die obige Codezeile konvertiert die Liste des Typs List<String> in List<Integer>.

Ich hoffe es war hilfreich.

0
Akash Anand

Sie können Code in meinem Repo berücksichtigen.

https://github.com/mohamedanees6/JavaUtils/wiki/CollectionUtils

castStringCollection(Collection<T>,Class)

0
Mohamed Anees A

Hier ist ein weiteres Beispiel, um die Macht von Guava zu zeigen. Obwohl ich nicht so Code schreibe, wollte ich alles zusammenpacken, um zu zeigen, welche funktionale Programmierung Guava für Java bereitstellt.

Function<String, Integer> strToInt=new Function<String, Integer>() {
    public Integer apply(String e) {
         return Integer.parseInt(e);
    }
};
String s = "AttributeGet:1,16,10106,10111";

List<Integer> attributeIDGet =(s.contains("AttributeGet:"))?
  FluentIterable
   .from(Iterables.skip(Splitter.on(CharMatcher.anyOf(";,")).split(s)), 1))
   .transform(strToInt)
   .toImmutableList():
   new ArrayList<Integer>();
0
husayt