【发布时间】:2020-10-01 04:08:30
【问题描述】:
您可能已经知道,当您将某些内容放入 HashMap 时,存储内容的顺序是随机的。我想使用 Comparable 订购我的 HashMap,但我无法让它正常工作。
这样我就有了地图:
Map<MyKeyObject, List<MyValueObject>> myObjectMap = new HashMap<>();
这个map的key是多个id和name的构造(MyKeyObject),我想先根据id对key上的map进行排序,如果id相同则name。
这是我尝试过的:
public class MyKeyObject implements Comparable<MyKeyObject> {
private Long id;
private String name;
public MyKeyObject(Long id, String name) {
this.id = id;
this.name = name;
}
public boolean equals(Long id, String name) {
return this.id.equals(id) && this.name.equals(name)
}
@Override
public int compareTo(MyKeyObject myKeyObject) {
if (this.id myKeyObject.getId() != 0) {
return (this.Id - myKeyObject.getId() == 1) ? 1 : -1;
} else {
return (this.name().compareTo(myKeyObject.name()) == 1) ? 1 : -1;
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyKeyObject that = (MyKeyObject) o;
return id.equals(that.id) &&
name == that.name;
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
}
public class MyKeyObject implements Comparable<MyKeyObject> {
Map<MyKeyObject, List<MyValueObject>> myObjectMap = new HashMap<>();
//Here I have a lot of code that populates the HashMap
myObjectMap.entrySet().stream().sorted(Map.Entry.comparingByKey());
}
说实话,我什至不认为 compareTo 方法被击中,我在这里做错了什么?
更新:我知道有 TreeMap 之类的类型,但它对我不起作用。我刚刚在这里给出了一个非常简单的例子,我的真实代码非常复杂。是否可以像我在这里尝试过的那样使用 Comparable 进行这项工作?
【问题讨论】:
-
HashMap没有定义的顺序,因此尝试订购它是不可能的。 -
您是否尝试过使用
LinkedHashMap而不是哈希图?哈希图永远不会包含顺序。 LinkedHashMap 维护插入顺序。 -
@scigs a
SortedMaplikeTreeMap可能是更好的选择。 -
正如 Andy 所说,
HashMap没有定义的顺序,但更进一步,Stream API 不是用于更改集合的工具。myObjectMap.entrySet().stream().sorted(Map.Entry.comparingByKey());行无效,因为它缺少实际操作。
标签: java sorting hashmap comparable