我有一个包含地图列表的列表
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
有很多可能性,这一个修改了原始列表:
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));
我认为使用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无需指定映射为数组。您可以使用方括号将任何映射视为数组: 请参阅页面上的最后一句话: 当然,我们可以将字段命名为标签,并一起跳过