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

如何在java中使用group By作为映射?

莘光华
2023-03-14

我有一个包含地图列表的列表


    Map<String, Object> hm = new HashMap<>();
    hm.put(id, 1);
    hm.put(amount, 25000);
    list.add(hm);

列表元素的索引=1,2,3,4,5,6

id=1, 2, 3 ,4 ,5, 4值

金额的值=10000、450000、25000、45000、35000、75000

列表应该排序如下(列表的索引)=6,4(id很大),2,5,3,1

共有2个答案

焦信鸥
2023-03-14

有很多可能性,这一个修改了原始列表:

Comparator<Map<String, Object>> sortByAmount = Comparator.comparing(m -> (int) m.get("amount"));
Comparator<Map<String, Object>> sortById = Comparator.comparing(m -> (int) m.get("id"));

list.sort(sortByAmount.reversed().thenComparing(sortById));

如果要保留原始列表,可以使用流api:

list.stream().sorted(sortByAmount.reversed().thenComparing(sortById));
祁承嗣
2023-03-14

我认为使用CustomObject而不是Map将帮助您以更简单的方式解决这个问题。

自定义对象

//fell free to change data type of fields as per your requirement
public class CustomObject {
    private Integer id;
    private Integer amount;

    public CustomObject(Integer id, Integer amount) {
        this.id = id;
        this.amount = amount;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getAmount() {
        return amount;
    }

    public void setAmount(Integer amount) {
        this.amount = amount;
    }
}

现在列表将包含对象而不是地图,这将使排序更加容易。

List<CustomObject> list=new ArrayList<>();
        CustomObject customObject1=new CustomObject(1,10000);
        CustomObject customObject2=new CustomObject(2,45000);
        CustomObject customObject3=new CustomObject(3,25000);
        CustomObject customObject4=new CustomObject(4,45000);
        CustomObject customObject5=new CustomObject(5,35000);
        CustomObject customObject6=new CustomObject(6,75000);

        list.add(customObject1);
        list.add(customObject2);
        list.add(customObject3);
        list.add(customObject4);
        list.add(customObject5);
        list.add(customObject6);

        // You can use thenComparing() as much as you required incase you want to compare with multiple field of your custom object
        // for your problem it has only two field
        Collections.sort(list, Comparator.comparing(CustomObject::getAmount)
                .thenComparing(CustomObject::getId).reversed());

        list.forEach(x->{

            System.out.println(x.getId()+" -->" +x.getAmount());
        });

输出:

6 -->75000
4 -->45000
2 -->45000
5 -->35000
3 -->25000
1 -->10000
 类似资料:
  • 我有一个包含地图列表的列表 列表元素的索引=1,2,3,4,5,6 id=1, 2, 3 ,4 ,5, 4值 金额的值=10000、450000、25000、45000、35000、75000 列表应该排序如下(列表的索引)=6,4(id很大),2,5,3,1

  • 问题内容: 1> 套装2排 2> 套装2排 3> 一组1行 为什么查询方式1>和2>会得到相同的结果?count(*)和count(somefiled)之间没有什么区别? 另外,查询2>和3>导致的结果不同,为什么 groupby 如此神奇?它是如何工作的? 更新:我正在使用MySQL5.1。:) 问题答案: 选择会给您一个结果集。如果按字段分组选择,则结果集的行将按该字段分组,并且结果集的每一行

  • 问题内容: 您如何先分组然后使用Java流应用过滤? 示例 :考虑此类:我想按部门分组,列出薪水大于2000的雇员。 这就是我可以做到的 输出量 由于B部门中没有雇员的薪水高于2000。因此B部门没有密钥: 但是实际上,我想使用空列表作为密钥– 预期产量 我们应该怎么做? 问题答案: nullpointer的答案显示了直接的方法。如果您不能更新到Java 9,没问题,那么这个收集器就没有魔力。这是

  • 因此,我的实体包含不同语言的名称,我希望将它映射到给定的 这是我的映射器类 现在我的问题是,我应该如何注释我的映射方法,以便它将理解为我的源对象,方法理解为字段的映射方法,方法的参数?

  • 我刚刚开始看Java8,为了尝试lambdas,我想我应该尝试重写我最近写的一个非常简单的东西。我需要将一个字符串到列的映射转换为另一个字符串到列的映射,其中新映射中的列是第一个映射中列的防御副本。列具有复制构造函数。到目前为止我得到的最接近的数据是: 但我相信一定有更好的方法来做这件事,我会很感激一些建议。

  • 问题内容: 我想为该外观创建一个映射: 在ElasticSearch文档中,我看到了以下示例: 但是,现在我很困惑。我希望看到的是: 那么,为什么该示例仅提供对另一个索引的引用?如何定义“标签”索引?或者,何时使用该数组映射? 问题答案: 因此,ElasticSearch无需指定映射为数组。您可以使用方括号将任何映射视为数组: 请参阅页面上的最后一句话: 当然,我们可以将字段命名为标签,并一起跳过