建议对列表中的值求和



我有一个字符串列表,如下所示:

"AB", "XY", 10
"CD", "XY", 15
"CD", "XY", 12
"AB", "XY", 19

我想做的是将第一个值的最后一个值中的数字相加,并将其放入新列表中。

所以那会给我:

"AB", "XY", 29
"CD", "XY", 27

我是Java的新手,所以我仍在为语法和不同的方法而苦苦挣扎。我研究了 compareTo() 和 equals() 方法,但唉。可以使用一些帮助。

第一个问题是:为什么你把它作为字符串列表?看起来您有一个包含 3 个属性的对象列表:2 个字符串和一个整数。拥有这样的数据结构将使代码更容易阅读和编写。

现在,要解决这个问题,你首先需要制作一个映射来保存字符串的第一部分和数字的总和:

  1. 使用流 API,通过使用Collectors.groupingBy收集器创建映射,该收集器将每个字符串分类为字符串的第一部分,即最后一个逗号之前的所有内容。然后,对于分类到同一键的所有值,我们使用 Collectors.summingInt ,对最后一个逗号之后的数字求和。
  2. 当我们拥有该地图时,我们可以迭代其所有条目并将每个条目转换回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);
}

输入数据:

"AB", "XY", 10
"CD", "XY", 15
"CD", "XY", 12
"AB", "XY", 19
"AB", "XY", 3

法典:

String inputData = ""AB", "XY", 10n"CD", "XY", 15n"CD", "XY", 12n"AB", "XY", 19n"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

相关内容

  • 没有找到相关文章

最新更新