如何对Java集合中的用户定义条件列表进行排序

时间:2018-12-20 08:27:41

标签: java list sorting

我要根据出现次数对以下项目进行排序

我正在使用

List<Gender> list = query.list();
Set<Gender> unique = new HashSet<Gender>(list);
        for (Gender key : unique) {
            System.out.println(key + ": " + Collections.frequency(list, key));
        }

但是上面的逻辑给出了相同的顺序,因为频率是基于完整列表而不是基于AssignedTo计数的。我想找到频率,然后根据频率对列表进行排序。

所有这些信息现在都存储在列表中。

2 个答案:

答案 0 :(得分:1)

如果要从SQL数据库中进行查询,则可以对AssignedTo进行计数并使用group by,然后以降序返回它们。

如果这只是Java语言,请使用循环遍历列表,并对每个AssignedTo进行计数。

答案 1 :(得分:0)

您可以尝试调整以下示例程序以首先找到频率,然后根据已排序的linkedHashMap填充列表。

    List<Gender> list = new ArrayList<>();
    list.add(Gender.FEMALE);
    list.add(Gender.MALE);
    list.add(Gender.MALE);
    list.add(Gender.FEMALE);
    list.add(Gender.MALE);
    list.add(Gender.FEMALE);

    list.add(Gender.MALE);
    Map<Gender,Long> frequency2 = list.stream().collect(
            Collectors.groupingBy(Function.identity(),Collectors.counting())
    ).entrySet().stream().sorted(Map.Entry.comparingByValue()).collect(
            (Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                    (oldValue, newValue) -> oldValue, LinkedHashMap::new)));

    List<Gender> result = new ArrayList<>();
    for (Map.Entry<Gender,Long> entry: frequency2.entrySet()) {
        for (int i = 0; i < entry.getValue(); i++) {
            result.add(entry.getKey());
        }
    }
    System.out.println(result);