Java 将逗号分隔的字符串转换为不带中间容器的列表

Java 将逗号分隔的字符串转换为不带中间容器的列表,java,Java,我需要将逗号分隔的字符串转换为整数列表。例如,如果我有以下字符串 String numbersArray = "1, 2, 3, 5, 7, 9,"; 是否有一种方法可以将其立即转换为列表 现在我只看到一种方法 List<String> numbers = Arrays.asList(numbersArray.split(",")); List number=Arrays.asList(numbersArray.split(“,”); 然后 List<Integer>

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

String numbersArray = "1, 2, 3, 5, 7, 9,";
是否有一种方法可以将其立即转换为
列表

现在我只看到一种方法

List<String> numbers = Arrays.asList(numbersArray.split(","));
List number=Arrays.asList(numbersArray.split(“,”);
然后

List<Integer> numbersInt = new ArrayList<>();
for (String number : numbers) {
    numbersInt.add(Integer.valueOf(nubmer));
}
List numbersInt=new ArrayList();
用于(字符串编号:数字){
numbersInt.add(Integer.valueOf(numer));
}

我很好奇,有没有一种方法可以让你错过
列表
的一部分,并在第一次开始时将其转换为
列表
如果你使用的是Java 8,你可以:

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

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

只要
字符串以逗号结尾,就像您的示例一样,这就行了

 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()));
 }
这个速度又快了一倍:

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();
    }
}
List List=new ArrayList();
for(int i=0,a=0,n=numbersArray.length();i
如果你愿意使用谷歌番石榴(),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 List=new ArrayList();
对于(字符串s:Splitter.on(',').trimResults().omitEmptyStrings().split(“1,2,3,14,5,”){
list.add(Integer.parseInt);
}
或者,您可以使用与原始方法类似的方法:

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

我认为下面的一段代码可能会对您有所帮助

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


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

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

int[] numbers = Arrays.stream(numbersArray.split(","))
                .map(String::trim).mapToInt(Integer::parseInt).toArray();
进一步讨论并总结如下:

因为您将数组转换为JDK的流,所以让它负责效率等

使用java 8流:

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

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


简短回答:不,除非你写了一个这样做的方法。更长:使用Java 8,您可以使用中间结果,并使用streams将其映射到
列表
。调用数字的序列化字符串形式
numbersArray
。CodesInChaos,例如,您的手动解析不处理负数。可能还有其他边缘情况,其行为与
.parseInt
不同。虽然它很有趣,但在生产代码中使用它可能不是一个好主意。我没有想过在生产代码中使用它!我只是把这当作一个有趣的学术练习,写一个尽可能快的算法。你可以调整它,使其适用于负片。我没有Java8,因此无法测试这些解决方案,但在所有其他解决方案中,
开关
是目前为止速度最快的一个。显然,如果使用反射来访问支持
字符串的
char
数组,则可以将迭代
字符串的速度提高一倍。请看这个问题-如果您想处理“没有中间容器”的项,您必须使用
Pattern.compile(“,”).splitAsStream(numbersArray).
,否则,实际上,数组是一种容器……下面是我的最爱。缩短并一次性处理不同的分隔符和空格
Stream.of(numbersArray.split(\\D+)).mapToInt(Integer::parseInt).toArray()OP询问的是整数,而不是长整数。此外,如果您在使用parseInt时添加更多关于如何以及为什么解决问题的信息(并且您还应该指定这只在Java 8中有效),您的答案更有可能被提升,因为parseInt返回一个int(不是整数),所以您正在为collect执行从字符串到int的转换,然后从int到整数的转换。如果您使用Integer::valueOf,您将从一个字符串变为一个整数。@JoeBlow很抱歉没有理解您的意思。你是说这和库马尔的回答很相似吗?嗨@BandiKishore,不,我只是指伟大的基肖尔·库马尔!:)干杯谢谢你的回答
List<Integer> longIds = Stream.of(commaSeperatedString.split(","))
                .map(Integer::parseInt)
                .collect(Collectors.toList());
Lists.transform(Arrays.asList(numbersArray.split(",")), new Function<String, Integer>() {
                    @Override
                    public Integer apply(String input) {
                        return Integer.parseInt(input.trim());
                    }
                });
int[] numbers = Arrays.asList(numbersArray.split(","))
                      .stream()
                      .map(String::trim)
                      .mapToInt(Integer::parseInt).toArray();