web-dev-qa-db-fra.com

Convertir la liste <String> en une liste <entier> directement

Après avoir analysé mon fichier "s" contient AttributeGet:1,16,10106,10111 

Donc, je dois obtenir tous les nombres après le colon dans la liste attributeIDGet. Je sais qu'il y a plusieurs façons de le faire. Mais pouvons-nous directement convertir List<String> en List<Integer>? Comme le code ci-dessous se plaint de l'incompatibilité de types, j'ai donc essayé de faire Integer.parseInt, mais je suppose que cela ne fonctionnera pas pour List. Voici s String.

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

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

Non, vous devez faire une boucle sur le tableau

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

Utilisation de Java8:

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

Convertisseurs de goyave faire le tour.

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
Michal Čizmazia

Non, vous devrez parcourir chaque élément:

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

Cela s’explique par le fait qu’il n’existe aucun moyen simple de convertir une liste d’un type en un autre type. Certaines conversions ne sont pas possibles ou doivent être effectuées de manière spécifique. Essentiellement, la conversion dépend des objets impliqués et du contexte de la conversion, de sorte qu'il n'y a pas de solution "taille unique". Par exemple, si vous aviez un objet Car et un objet Person. Vous ne pouvez pas convertir un List<Car> en un List<Person> directement car cela n’a pas vraiment de sens.

8
Vivin Paliath

Si vous utilisez la bibliothèque Google Guava voici ce que vous pouvez faire, voir Listes # 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);
            };
        });
    }

Oui, d'accord avec la réponse ci-dessus, c'est que c'est gonflé, mais élégant. Mais c'est juste une autre façon.

7
Nishant

Pourquoi n'utilisez-vous pas stream pour convertir une liste de chaînes en une liste d'entiers?

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

opération complète pourrait être quelque chose comme ça

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

Si vous êtes autorisé à utiliser lambdas à partir de Java 8, vous pouvez utiliser l'exemple de code suivant.

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

Pas d'utilisation de bibliothèques externes. Plaine vieux nouvelle Java!

3
javatarz

Vous pouvez utiliser les fonctions Lambda de Java 8 pour y parvenir sans bouclage.

    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

Non, il n'y a aucun moyen (que je sache) de le faire en Java.

En gros, vous devrez transformer chaque entrée de String en Integer.

Ce que vous recherchez pourrait être réalisé dans un langage plus fonctionnel, dans lequel vous pourriez passer une fonction de transformation et l'appliquer à chaque élément de la liste ... mais ce n'est pas possible (cela s'appliquerait toujours à tous les éléments de la liste. ).

Overkill:

Vous pouvez toutefois utiliser une fonction de Google Guava (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Function.html) pour simuler une approche plus fonctionnelle, si est ce que vous cherchez.

Si vous craignez de parcourir la liste deux fois, utilisez plutôt un Tokenizer au lieu de scinder et transformez chaque jeton d'entier en entier avant de l'ajouter à la liste.

1
pcalcao

Utilisation de Streams et Lambda:

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

La ligne de code ci-dessus convertira la liste de type List<String> en List<Integer>.

J'espère que c'était utile.

0
Akash Anand

Voici un autre exemple pour montrer le pouvoir de la goyave. Bien que ce ne soit pas la façon dont j'écris le code, je souhaitais l'intégrer pour montrer le type de programmation fonctionnelle que Java fournit à Guava.

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