有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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>


共 (6) 个答案

  1. # 1 楼答案

    只要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();
        }
    }
    
  2. # 2 楼答案

    我真的很喜欢@marounnaroun的答案,但我想知道使用Arrays.stream-方法而不是Arrays.asList是否更好

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

    This SO-question进一步讨论并总结如下:

    because you leave the conversion of the array to a stream to the JDK - let it be responsible for efficiency etc.

  3. # 3 楼答案

    如果你愿意使用谷歌番石榴(https://code.google.com/p/guava-libraries/),splitter是你的朋友

        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()));
    }
    
  4. # 4 楼答案

    如果您不在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中提到的,您可以使用流

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

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

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

    如果不是,我认为你的方法是最好的选择

  6. # 6 楼答案

    使用java 8流:

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