代码之家  ›  专栏  ›  技术社区  ›  Al Grant

统计列表中的对象组

  •  0
  • Al Grant  · 技术社区  · 4 年前

    我有一个对象列表,需要计算在Java 8中具有相同日期、位置和颜色的对象的数量:

    public class Entity
    
      public static void main(String[] args) {
    
         List<Schedule> schedule = new ArrayList<Scheudle>();
         schedule.add(new Schedule("12/12/2021", "Los Angeles", "Red", "Bob"));
         schedule.add(new Schedule("12/12/2021", "Los Angeles", "Red", "Jimmy"));
         schedule.add(new Schedule("12/12/2021", "Los Angeles", "Red", "Tim"));
         schedule.add(new Schedule("12/12/2021", "Los Angeles", "Blue", "Mary"));
         schedule.add(new Schedule("12/12/2021", "Los Angeles", "Green", "Jane"));
         schedule.add(new Schedule("12/12/2021", "Los Angeles", "Green", "Jane"));
         schedule.add(new Schedule("13/12/2021", "San Deigo", "Red", "Bob"));
         schedule.add(new Schedule("13/12/2021", "San Deigo", "Green", "James"));
         schedule.add(new Schedule("13/12/2021", "San Deigo", "Green", "Anne"));
         schedule.add(new Schedule("14/12/2021", "Los Angeles", "Red", "James"));
    }
    

    因此,对于上述情况,总数是指在日期、地点和颜色的组合下工作的人数。即。:

    • 2021年12月12日洛杉矶红-3
    • 2021年12月12日洛杉矶蓝-1
    • 2021年12月12日洛杉矶绿地-2
    • 2021年12月13日圣地戈绿-2
    • 2021年12月13日圣地戈红-1
    • 2021年12月14日洛杉矶红-1

    如何做到这一点?

    0 回复  |  直到 4 年前
        1
  •  1
  •   AvmnuSng    4 年前

    您可以在这三个字段上分组 date , location color :

    schedule.stream().collect(
        Collectors.groupingBy(Schedule::getDate,
            Collectors.groupingBy(Schedule::getCity,
                Collectors.groupingBy(Schedule::getColor,
                    Collectors.counting()
                )
            )
        )
    )
    

    它生成嵌套的 Map :

    {
        14/12/2021={
            Los Angeles={Red=1}
        },
        13/12/2021={
            San Deigo={Red=1, Green=2}
        },
        12/12/2021={
            Los Angeles={Red=3, Blue=1, Green=2}
        }
    }
    
        2
  •  1
  •   user4910279 user4910279    4 年前

    试试这个。

    record Schedule(String date, String location, String color, String name) {}
    List<Schedule> schedule = new ArrayList<Schedule>();
    schedule.add(new Schedule("12/12/2021", "Los Angeles", "Red", "Bob"));
    schedule.add(new Schedule("12/12/2021", "Los Angeles", "Red", "Jimmy"));
    schedule.add(new Schedule("12/12/2021", "Los Angeles", "Red", "Tim"));
    schedule.add(new Schedule("12/12/2021", "Los Angeles", "Blue", "Mary"));
    schedule.add(new Schedule("12/12/2021", "Los Angeles", "Green", "Jane"));
    schedule.add(new Schedule("12/12/2021", "Los Angeles", "Green", "Jane"));
    schedule.add(new Schedule("13/12/2021", "San Deigo", "Red", "Bob"));
    schedule.add(new Schedule("13/12/2021", "San Deigo", "Green", "James"));
    schedule.add(new Schedule("13/12/2021", "San Deigo", "Green", "Anne"));
    schedule.add(new Schedule("14/12/2021", "Los Angeles", "Red", "James"));
    record ScheduleGroup(String date, String location, String color) {}
    Map<ScheduleGroup, Long> groups = schedule.stream()
        .collect(Collectors.groupingBy(
            s -> new ScheduleGroup(s.date(), s.location(), s.color()),
            Collectors.counting()));
    for (Entry<ScheduleGroup, Long> g : groups.entrySet())
        System.out.println(g);
    

    输出:

    ScheduleGroup[date=13/12/2021, location=San Deigo, color=Green]=2
    ScheduleGroup[date=12/12/2021, location=Los Angeles, color=Blue]=1
    ScheduleGroup[date=14/12/2021, location=Los Angeles, color=Red]=1
    ScheduleGroup[date=13/12/2021, location=San Deigo, color=Red]=1
    ScheduleGroup[date=12/12/2021, location=Los Angeles, color=Green]=2
    ScheduleGroup[date=12/12/2021, location=Los Angeles, color=Red]=3
    
        3
  •  0
  •   DARK FOREST    4 年前

    你总是可以列出一个列表(即“邻接列表”)。 比如“ArrayList<ArrayList<String>”。