建议总结列表中的值

时间:2016-02-28 17:26:25

标签: java list sum compare

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

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

我想要做的是总结第一个值的最后一个值中的数字,并将其放在一个新列表中。

所以这会给我:

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

我是Java的新手,所以我仍然在努力学习语法和不同的方法。我查看了compareTo()和equals()方法但是唉。可以使用一些帮助。

2 个答案:

答案 0 :(得分:3)

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

现在,要解决这个问题,首先需要制作一个包含字符串第一部分和数字总和的地图:

  1. 使用Stream API,通过使用Collectors.groupingBy收集器创建映射,该收集器将每个String分类为String的第一部分,即最后一个逗号之前的所有内容。然后,对于分类到相同键的所有值,我们使用Collectors.summingInt求和最后一个逗号后面的数字。
  2. 当我们拥有该地图时,我们可以迭代其所有条目并将每个条目转换回String,最后将其收集到Collectors.toList()的列表中。
  3. 示例代码:

    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