我有一个如下所示的字符串列表:
"AB", "XY", 10
"CD", "XY", 15
"CD", "XY", 12
"AB", "XY", 19
我想要做的是总结第一个值的最后一个值中的数字,并将其放在一个新列表中。
所以这会给我:
"AB", "XY", 29
"CD", "XY", 27
我是Java的新手,所以我仍然在努力学习语法和不同的方法。我查看了compareTo()和equals()方法但是唉。可以使用一些帮助。
答案 0 :(得分:3)
第一个问题是:为什么你将它作为String列表?看来你有一个包含3个属性的对象列表:2个字符串和一个整数。拥有这样的数据结构会使代码更容易读写。
现在,要解决这个问题,首先需要制作一个包含字符串第一部分和数字总和的地图:
Collectors.groupingBy
收集器创建映射,该收集器将每个String分类为String的第一部分,即最后一个逗号之前的所有内容。然后,对于分类到相同键的所有值,我们使用Collectors.summingInt
求和最后一个逗号后面的数字。String
,最后将其收集到Collectors.toList()
的列表中。示例代码:
public static void main(String[] args) {
List<String> list = Arrays.asList("\"AB\", \"XY\", 10", "\"CD\", \"XY\", 15", "\"CD\", \"XY\", 12", "\"AB\", \"XY\", 19");
Map<String, Integer> map =
list.stream()
.collect(Collectors.groupingBy(
s -> s.substring(0, s.lastIndexOf(',')),
Collectors.summingInt(s -> Integer.parseInt(s.substring(s.lastIndexOf(',') + 2)))
));
List<String> result =
map.entrySet()
.stream()
.map(e -> e.getKey() + ", " + e.getValue())
.collect(Collectors.toList());
System.out.println(result);
}
答案 1 :(得分:0)
输入数据:
"AB", "XY", 10
"CD", "XY", 15
"CD", "XY", 12
"AB", "XY", 19
"AB", "XY", 3
代码:
String inputData = "\"AB\", \"XY\", 10\n\"CD\", \"XY\", 15\n\"CD\", \"XY\", 12\n\"AB\", \"XY\", 19\n\"AB\", \"XY\", 3";
final String[] lines = inputData.split("\\n");
Map<String,Integer> results = new HashMap<>();
final Pattern compiledPattern = Pattern.compile("([\\\"A-Z,\\s]+),\\s(\\d+)");
for (String line : lines) {
final Matcher matcher = compiledPattern.matcher(line);
if (matcher.matches()) {
final String groupName = matcher.group(1);
final int value = Integer.valueOf(matcher.group(2));
if (results.containsKey(groupName)) {
final Integer currentValue = results.get(groupName);
results.put(groupName, (currentValue+value));
} else {
results.put(groupName, value);
}
}
输出我的数据:
"CD", "XY" > 27
"AB", "XY" > 32