当前位置: 首页 > 知识库问答 >
问题:

Java中对象的聚合列表

乜思淼
2023-03-14

我们在Java中有任何聚合器函数来执行下面的聚合吗?

Person {
    String name;
    String subject;
    String department;
    Long mark1;
    Long mark2;
    Long mark3;
}
Name    |Subject    |Department |Mark1  |Mark2  |Mark3
--------|-----------|-----------|-------|-------|-----
Clark   |English    |DEP1       |7      |8      |6
Michel  |English    |DEP1       |6      |4      |7
Dave    |Maths      |DEP2       |3      |5      |6
Mario   |Maths      |DEP1       |9      |7      |8
Subject     |Department |Mark1  |Mark2  |Mark3
----------- |-----------|-------|-------|-----
English     |DEP1       |13     |12     |13
Maths       |DEP2       |3      |5      |6
Maths       |DEP1       |9      |7      |8
private static List<Person> getGrouped(List<Person> origList) {
    Map<String, Person> grpMap = new HashMap<String, Person>();

    for (Person person : origList) {
        String key = person.getDepartment() + person.getSubject();
        if (grpMap.containsKey(key)) {
            Person grpdPerson = grpMap.get(key);
            grpdPerson.setMark1(grpdPerson.getMark1() + person.getMark1());
            grpdPerson.setMark2(grpdPerson.getMark2() + person.getMark2());
            grpdPerson.setMark3(grpdPerson.getMark3() + person.getMark3());
        } else {
            grpMap.put(key, person);
        }
    }
    return new ArrayList<Person>(grpMap.values());
}

共有1个答案

程和煦
2023-03-14

你可以用还原。聚合mark1的示例如下所示。

public class Test {

    static class Person {
        Person(String name, String subject, String department, Long mark1, Long mark2, Long mark3) {
            this.name = name;
            this.subject = subject;
            this.department = department;
            this.mark1 = mark1;
            this.mark2 = mark2;
            this.mark3= mark3;
        }
            String name;
            String subject;
            String department;
            Long mark1;
            Long mark2;
            Long mark3;

            String group() {
                return subject+department;
            }

            Long getMark1() {
                return mark1;
            }
    }

      public static void main(String[] args)
      {
        List<Person> list = new ArrayList<Test.Person>();
        list.add(new Test.Person("Clark","English","DEP1",7l,8l,6l));
        list.add(new Test.Person("Michel","English","DEP1",6l,4l,7l));
        list.add(new Test.Person("Dave","Maths","DEP2",3l,5l,6l));
        list.add(new Test.Person("Mario","Maths","DEP1",9l,7l,8l));

        Map<String, Long> groups = list.stream().collect(Collectors.groupingBy(Person::group, Collectors.reducing(
                    0l, Person::getMark1, Long::sum)));

        //Or alternatively as suggested by Holger 
        Map<String, Long> groupsNew = list.stream().collect(Collectors.groupingBy(Person::group, Collectors.summingLong(Person::getMark1)));

        System.out.println(groups);

      }

}

仍在研究通过单个函数生成输出。完成后将更新。

 类似资料:
  • 问题内容: 我有一个带有20个属性的Java类及其相应的getter和setters。我也有两个对象列表:和。 现在,我想合并两个列表,并避免基于和的重复对象。 使用Java 8: 但是我必须在哪里指定属性?我应该重写和方法吗? 问题答案: 如果要实现and ,则 在 类 内部 进行操作。在该类中添加类似的方法 如果您这样做了,在上调用将自动执行正确的操作。 如果您不想(或无法)更改类,则没有平等

  • 我有List sample1=lists.newarrayList(BIGINTEGER1,BIGINTEGER2,BIGINTEGER3); 我必须创建一个新的列表sample2,其中还有一个值“bigInteger4”,以及sample1列表: 我怎么能那样做?

  • 我有个无法解决的问题。我希望我能让你明白。 给定以下航路点对象列表

  • 问题内容: 我完全相信我的问题很简单,但我无法使用流进行处理(如果有一种方法也可以不使用流进行处理,那么它也会有所帮助)假设我们有此用户列表 并假设我们的List 中包含以下数据 在此预期的结果它因为名字,姓氏和类型列表中出现了两次只是合并是常见的结果,而不会错过任何领域的 预期成果 问题答案: 您可以创建一个包含三个字段的键类,例如 分组 这些可以用来对您的用户进行分组 这些列表中的每一个都可以

  • 我有一个Java类,它有20个属性及其相应的getter和setter。还有两个对象列表:和。 使用Java 8: 但是我必须在哪个地方指定属性呢?是否应该重写和方法?