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

时间:2014-12-22 09:28:22

标签: java

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

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

有没有办法如何将其一次转换为List<Integer>

现在我只看到一种方法。

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

然后

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

我很好奇有没有办法错过与List<String>的分享,并在第一次开始时将其转换为List<Integer>

7 个答案:

答案 0 :(得分:32)

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

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

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

答案 1 :(得分:11)

使用java 8 Streams:

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

答案 2 :(得分:3)

我非常喜欢@ MarounMaroun的答案,但我想知道使用Arrays.stream - 方法而不是Arrays.asList是否更好。

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

This SO-question进一步讨论了这个问题并将其概括为:

  

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

答案 3 :(得分:2)

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

 String numbersArray = "1, 2, 3, 14, 5,";
 List<Integer> list = new ArrayList<Integer>();
 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<Integer> list = new ArrayList<Integer>();
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<Integer> list = new ArrayList<Integer>();
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();
    }
}

答案 4 :(得分:1)

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

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

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

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

答案 5 :(得分:1)

如果您不使用java8,则可以使用Guava

Lists.transform(Arrays.asList(numbersArray.split(",")), new Function<String, Integer>() {
                    @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();

答案 6 :(得分:0)

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

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将其添加到整数列表。

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