将逗号分隔的字符串转换为没有中间容器的列表

我需要将逗号分隔的字符串转换为整数列表。 例如,如果我有以下字符串

String numbersArray = "1, 2, 3, 5, 7, 9,"; 

有没有办法如何将它一次转换为List

现在我只看到一种方法。

 List numbers = Arrays.asList(numbersArray.split(",")); 

接着

 List numbersInt = new ArrayList(); for (String number : numbers) { numbersInt.add(Integer.valueOf(nubmer)); } 

我很好奇有没有办法如何错过List部分,并在第一次开始时将其转换为List

如果您使用的是Java 8,则可以:

 int[] numbers = Arrays.asList(numbersArray.split(",")) .stream() .map(String::trim) .mapToInt(Integer::parseInt).toArray(); 

如果没有,我认为您的方法是最好的选择。

使用java 8 Streams:

 List longIds = Stream.of(commaSeperatedString.split(",")) .map(Integer::parseInt) .collect(Collectors.toList()); 

我非常喜欢@ MarounMaroun的答案,但我想知道使用Arrays.stream -method代替Arrays.asList

 int[] numbers = Arrays.stream(numbersArray.split(",")) .map(String::trim).mapToInt(Integer::parseInt).toArray(); 

这个SO问题进一步讨论了这个问题,并总结如下:

因为您将数组的转换保留为JDK的流 – 让它负责效率等。

只要String以逗号结尾,就像您的示例一样,这是有效的。

  String numbersArray = "1, 2, 3, 14, 5,"; List list = new ArrayList(); for (int i = 0, j, n = numbersArray.length(); i < n; i = j + 1) { j = numbersArray.indexOf(",", i); list.add(Integer.parseInt(numbersArray.substring(i, j).trim())); } 

然而,这很没用,因为在我的机器上它比原来慢了大约2倍。

另一方面,这种下一个解决方案非常快。 我在使用Math.abs(random.nextInt())获得的50000个整数列表上测试它,它比原始速度快大约4倍。

 List list = new ArrayList(); for (int i = 0, a = 0, n = numbersArray.length(); i < n; i++) { char c = numbersArray.charAt(i); if (c == ',') { list.add(a); a = 0; } else if (c != ' ') { a = a * 10 + (c - '0'); } } 

而这又快了两倍:

 List list = new ArrayList(); for (int i = 0, a = 0, n = numbersArray.length(); i < n; i++) { switch(numbersArray.charAt(i)) { case ',': list.add(a); a = 0; break; case ' ': break; case '0': a = a * 10; break; case '1': a = a * 10 + 1; break; case '2': a = a * 10 + 2; break; case '3': a = a * 10 + 3; break; case '4': a = a * 10 + 4; break; case '5': a = a * 10 + 5; break; case '6': a = a * 10 + 6; break; case '7': a = a * 10 + 7; break; case '8': a = a * 10 + 8; break; case '9': a = a * 10 + 9; break; default: throw new AssertionError(); } } 

如果您愿意使用Google Guava( https://code.google.com/p/guava-libraries/ ),splitter是您的朋友

  List list = new ArrayList(); for ( String s : Splitter.on(',').trimResults().omitEmptyStrings().split("1, 2, 3, 14, 5,") ) { list.add(Integer.parseInt(s)); } 

或者,您可以使用类似于您原始方法的内容,并且:

 List list = new ArrayList(); for (String s :"1, 2, 3, 5, 7, 9,".split(",") ) { list.add(Integer.parseInt(s.trim())); } 

如果您不在java8上,那么您可以使用Guava

 Lists.transform(Arrays.asList(numbersArray.split(",")), new Function() { @Override public Integer apply(String input) { return Integer.parseInt(input.trim()); } }); 

正如@Maroun为Java8所提到的,您可以使用Streams。

 int[] numbers = Arrays.asList(numbersArray.split(",")) .stream() .map(String::trim) .mapToInt(Integer::parseInt).toArray(); 

我认为下面的代码可能对你有所帮助。

 import java.util.Scanner; public class Solution { public static void main(String[] args) throws java.io.IOException { String numbersArray = "1, 2, 3, 5, 7, 9,"; System.out.println(numbersArray); Scanner sc = new Scanner(numbersArray); sc.useDelimiter("(, *)*"); try{ while(true){ System.out.println(sc.nextInt()); } } catch (Exception e) { System.out.println("reading is completed"); } } } 

而不是使用System.out.println将其添加到整数列表。

在这里,我们不是多次遍历完整列表,而是仅遍历一次并将它们存储在数组中。