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

如何在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

我认为使用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
华知
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));
 类似资料:
  • 我有一个包含地图列表的列表 列表元素的索引=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

  • 我有以下代码: 如果我想迭代Map,上面的代码工作得很好。但是现在我有这样的东西。 我想在映射中遍历映射,并获取它的键和值。我想得到key1、value1、key2、value2、key3、value3的值,依此类推。那我该怎么做呢?

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

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

  • 问题内容: 给定一个Person上具有(etc)方法的where,我该如何将其转换为通过调用获得的where ? 我会使用Java 8之前的版本 但我想使用流和lambda做到这一点。 我看不到如何以功能样式执行此操作:Map / HashMap不实现。 返回可以流式传输的,但是如何向目的地地图添加新的内容? 问题答案: 使用Java 8,您可以执行以下操作: 尽管使用Guava的Maps.tra

  • 下面是Main中的随机客户端列表 第二类:产品(字符串名称、枚举类别、BigDecimal价格) 目标->预期结果:在类Main中,创建类Shopping的实例,其中属性是具有 的映射,并用随机数据//integer-购买了多少产品 null null