java 将逗号分隔值转换为列表< Long>

ovfsdjhp  于 2023-01-16  发布在  Java
关注(0)|答案(7)|浏览(281)

假设我有一组像1,2,3,4,5,6,7这样的数字作为一个String输入,我想把这些数字转换成Long对象的List,即List<Long>
谁能推荐最简单的方法?

tnkciper

tnkciper1#

你是说像这样的东西?

String numbers = "1,2,3,4,5,6,7";

List<Long> list = new ArrayList<Long>();
for (String s : numbers.split(","))
    list.add(Long.parseLong(s));

System.out.println(list);

从Java 8开始,您可以将其重写为

List<Long> list = Stream.of(numbers.split(","))
        .map(Long::parseLong)
        .collect(Collectors.toList());

如果您想获得List<String>,请使用稍短的版本

List<String> fixedSizeList = Arrays.asList(numbers.split(","));
List<String> resizableList = new ArrayList<>(fixedSizeList);

或一行程序

List<String> list = new ArrayList<>(Arrays.asList(numbers.split(",")));

奖金信息:
如果您的数据可能是String data = "1, 2 , 3,4";,其中逗号被一些空格包围,则split(",")将生成["1", " 2 ", " 3", "4"]这样的结果数组。
如您所见,数组中第二个和第三个元素包含这些额外空格:" 2 "" 3",这将导致Long.parseLong抛出NumberFormatException(因为空格不是正确的数值)。
这里的解决方案是:

  • 在像Long.parseLong(s.trim())一样进行解析之前,对这些单独的元素使用String#trim
    • 消耗 * ,上多余的空格。为此,我们可以使用split("\\s*,\\s*"),其中
  • \s(在字符串中写成"\\s")表示空白
  • *是表示 * 零或更多 * 的量词,因此"\\s*"表示零或更多空格(换句话说,使其可选)
inkz8wg9

inkz8wg92#

使用java-8的简单方便的解决方案(为了完成线程):

String str = "1,2,3,4,5,6,7";
List<Long> list = Arrays.stream(str.split(",")).map(Long::parseLong).collect(Collectors.toList());
System.out.println(list);

[一、二、三、四、五、六、七]
更好的是,使用Pattern.splitAsStream()

Pattern.compile(",").splitAsStream(str).map(Long::parseLong).collect(Collectors‌​.toList());
csbfibhn

csbfibhn3#

String input = "1,2,3,4,5,6,7";
String[] numbers = input.split("\\,");
List<Integer> result = new ArrayList<Integer>();
for(String number : numbers) {
    try {
        result.add(Integer.parseInt(number.trim()));
    } catch(Exception e) {
        // log about conversion error
    }
}
mznpcxlj

mznpcxlj4#

您可以使用String.split()Long.valueOf()

String numbers = "1,2,3,4,5,6,7";
List<Long> list = new ArrayList<Long>();
for (String s : numbers.split(","))
    list.add(Long.valueOf(s));

System.out.println(list);
dddzy1tm

dddzy1tm5#

如果您不使用java8并且不想使用循环,那么可以使用Guava

List<Long> longValues = Lists.transform(Arrays.asList(numbersArray.split(",")), new Function<String, Long>() {
                @Override
                public Long apply(String input) {
                    return Long.parseLong(input.trim());
                }
            });

正如其他人提到的,对于Java8,您可以使用流。

List<Long> numbers = Arrays.asList(numbersArray.split(","))
                      .stream()
                      .map(String::trim)
                      .map(Long::parseLong)
                      .collect(Collectors.toList());
vnjpjtjt

vnjpjtjt6#

我最近使用了以下方法:

import static com.google.common.collect.ImmutableList.toImmutableList;
import com.google.common.base.Splitter;
import com.google.common.collect.ImmutableList;
...

    final ImmutableList<Long> result = Splitter.on(",")
        .trimResults()
        .omitEmptyStrings()
        .splitToStream(value)
        .map(Long::valueOf)
        .collect(toImmutableList());

这使用了来自Guava的Splitter(用于处理空字符串和空格),并且没有使用surprising String.split()

ruarlubt

ruarlubt7#

我会用谷歌的Guava库来做这件事。字符串。分裂可能会导致许多麻烦。

String numbers="1,2,3,4,5,6,7";
Iterable<String> splitIterator = Splitter.on(',').split(numbers);
List<String> list= Lists.newArrayList(splitIterator );

相关问题