2012-05-22 9 views
43

Después de analizar mi archivo contiene s AttributeGet:1,16,10106,10111Convertir <String> a la lista <Integer> directamente

Así que necesito para obtener todos los números después de punto y coma en la lista de attributeIDGet. Sé que hay varias formas de hacerlo. ¿Pero hay alguna manera de que podamos Convertir directamente List<String> a List<Integer>. Como el código a continuación se queja sobre el tipo no coincide, intenté hacer el Integer.parseInt, pero supongo que esto no funcionará para List. Aquí está s String.

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

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

Respuesta

50

No, es necesario para recorrer la matriz

for(String s : strList) intList.add(Integer.valueOf(s)); 
+2

Lo usted escribió es ef girando fecundamente sobre los valores. Pero es una solución elegante, sin embargo. Solo para agregar a eso. Con los nuevos métodos lambda. 'intList.addAll (strList.stream(). Map (Integer :: valueOf) .collect (Collectors.toList()));' – frugalcoder

+1

O incluso strList.foreach (s-> intList.add (Integer.valueOf (s));.. – Heisenberg

+3

avance rápido 5 años y ahora hay respuestas a continuación que el uso de Java 8 flujos de hacer esto en una línea sin necesidad de utilizar un bucle – Catfish

8

No, usted tiene que iterar sobre cada elemento:

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

La razón por la que esto sucede es que no hay una forma sencilla de convertir una lista de un tipo a cualquier otra tipo. Algunas conversiones no son posibles o deben realizarse de una manera específica. Esencialmente, la conversión depende de los objetos involucrados y del contexto de la conversión, por lo que no existe una solución de "talla única". Por ejemplo, ¿qué pasa si tiene un objeto Car y un objeto Person? No puede convertir un List<Car> en un List<Person> directamente, ya que realmente no tiene sentido.

1

No, no hay manera (que yo sepa), de hacerlo en Java.

Básicamente, tendrá que transformar cada entrada de Cadena en Entero.

Lo que está buscando podría lograrse en un lenguaje más funcional, donde podría pasar una función de transformación y aplicarla a cada elemento de la lista ... pero eso no es posible (todavía se aplicaría a cada elemento en la lista).

Overkill:

Puede, sin embargo, utilizar una función de Google guayaba (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Function .html) para simular un enfoque más funcional, si eso es lo que estás buscando.

Si le preocupa repetir la lista dos veces, en lugar de dividir use un Tokenizer y transforme cada token de entero en Integer antes de agregarlo a la lista.

+0

usando 'Function' aquí es una exageración manera –

+0

que sé, no va a lograr nada en términos de eficiencia y * * es una exageración, yo sólo quería señalarlo como una manera de simular un enfoque más "funcional". por desgracia, sólo está imitando el comportamiento y que por lo general terminan con el código de hinchado. – pcalcao

7

Si utiliza Google Guava library esto es lo que puede hacer, ver Lists#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); 
      }; 
     }); 
    } 

Sí, de acuerdo con la respuesta anterior es que es hinchado, pero con estilo. Pero es solo otra forma.

0

Aquí hay otro ejemplo para mostrar la potencia de la guayaba. Aunque, esta no es la forma en que escribo el código, quería empaquetarlo todo para mostrar qué tipo de programación funcional proporciona Guava para Java.

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

Si puede usar lambdas de Java 8, puede usar el siguiente ejemplo de código.

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

Sin uso de bibliotecas externas. Normal antiguo nuevo Java!

+0

I estoy consiguiendo este error de sintaxis: tipo incorrecto: no se puede convertir de String a int interior función de mapa se puede PLZ me ayude con esto –

+0

@SonalMaheshwari Qué versión de Java está utilizando (y en qué entorno).? Estoy en '1.8.0_05' en Mac OS X. ¿También puede proporcionar un [SSCCE] (http://www.sscce.org) (en [pastebin] (http://pastebin.com) o un equivalente)? – javatarz

+0

Mejor respuesta aquí –

4

¿Por qué no usar corriente para convertir lista de cadenas a la lista de números enteros? , como a continuación

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

operación completa podría ser algo como esto

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

Guava Converters hacer el truco.

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

Usando lambda:

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

1

Puede utilizar las funciones Lambda de Java 8 para lograr esto sin bucle

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

Usando Java8:

stringList.stream().map(Integer::parseInt).collect(Collectors.toList()); 
+0

limpio. Me gusta. –

+0

si envía StringList al método (Lista ) no puede. Creo que necesito crear nueva lista y el bucle – Adam

+0

mejor respuesta para después J8. – Leon

Cuestiones relacionadas