gpt4 book ai didi

java - 从字符串构建 List

转载 作者:行者123 更新时间:2023-11-29 06:55:31 25 4
gpt4 key购买 nike

我正在尝试创建一个通用函数,该函数基于一个字符串构建任何类型的列表,该字符串包含由逗号分隔的该类型的值。我这样做了:

public static <T> List<T> stringToList(String listStr, Class<T> itemType)
{
return Arrays.asList(listStr.split(",")).stream().map(x -> itemType.cast(x.replaceAll("\\s+|\"|\t","")))).collect(Collectors.toList());
}

当我尝试使用以下方法对其进行测试时:

String listStringsStr  = "\"Foo\", \"Bar\"";
List<String> resS = stringToList(listStringsStr, String.class);

String listIntegersStr = "1,10,-1,0";
List<Integer> resI = stringToList(listStringsStr, Integer.class);

我有两个问题。

  1. 在第一种情况(字符串)中,我在每个字符串项周围使用了额外的双引号:“"Foo""、""Bar"。
  2. 在第二种情况(整数)中,我得到一个 java.lang.ClassCastException: Cannot cast java.lang.String to java.lang.Integer 这意味着它不能转换“1”到 1。我知道这适用于 Integer::parseInt,但我想创建一个通用方法。

有什么想法吗?

[编辑] - 因为我发布的方式造成了混淆,所以我添加了测试代码:

String listStringsStr  = "\"Foo\", \"Bar\"";
List<String> listStrings = Arrays.asList("Foo", "Bar");
String listIntegersStr = "1,10,-1,0";
List<Integer> listIntegers = Arrays.asList(1, 10, -1, 0);

List<String> resS = stringToList(listStringsStr, String.class);
System.out.println(resS);
System.out.println(listStrings);
assert (resS.containsAll(listStrings));

List<Integer> resI = stringToList(listIntegersStr, Integer.class);
System.out.println(resI);
System.out.println(listIntegers);
assert (resI.containsAll(listIntegers));

在包含 x.replaceAll("\\s+|\"|\t","") 之后,第一个断言现在通过了,第二个断言失败了。控制台输出是

[Foo, Bar]
[Foo, Bar]
[1, 10, -1, 0]
[1, 10, -1, 0]

listIntegers 持有 Integer 因此我想 resI 持有 int,或者我只是破坏了 java 的类型安全 :D

最佳答案

对于问题 #2:一个简单的修改是传递一个 Function<String, T>而不是 Class<T> .该函数将定义如何将字符串解析为所需类型的类。一些可能的值:

Function<String, String> stringParser = s -> s;
Function<String, Integer> intParser = s -> Integer.parseInt(s);

对于问题 #1:在示例中,您给的输入字符串确实包含引号。您可以输入字符串 "Foo,Bar"以避免在输出中有引号。如果您无法控制输入,则可以修剪引号/空格/等。作为解析功能的一部分,或者用比用逗号分隔更高级的东西分隔单词 - 输入是 CSV 文件吗?

关于java - 从字符串构建 List<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35043608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com