我需要一个Sorted Map,其中所有元素都按某个键排序,但我需要能够通过另一个键获取元素。
我认为我可以通过创建自定义密钥来解决此任务:
public class MyKey implements Comparable<MyKey>{
private long id;
private double price;
public MyKey(long orderId, double price) {
this.id = id;
this.price = price;
}
@Override
public int hashCode(){
return Objects.hash(id);
}
@Override
public boolean equals(Object o){
if(!(o instanceof MyKey)) return false;
return id == ((MyKey) o).id;
}
@Override
public int compareTo(MyKey o) {
if(price > o.price) return 1;
if(price < o.price) return -1;
return 0;
}
}
这是我需要能够按键获取元素,但我需要强制Map按价格排序。
我试图使用:
Map<MyKey, Integer> myTestMap = new ConcurrentSkipListMap<>();
myTestMap.put(new MyKey(1, 200.0), 1);
myTestMap.put(new MyKey(2, 100.0), 2);
myTestMap.put(new MyKey(3, 300.0), 3);
myTestMap.put(new MyKey(6, 500.0), 6);
myTestMap.put(new MyKey(5, 400.0), 5);
myTestMap.put(new MyKey(4, 600.0), 4);
在这种情况下,Map按价格成功排序,但我无法通过使用以下方式获取元素:
System.out.println(myTestMap.get(new MyKey(2, 0)));
我必须设定价格才能获得元素:
System.out.println(myTestMap.get(new MyKey(2, 100.0)));
在这种情况下是否有解决方法?
答案 0 :(得分:1)
您的答案没有真正的解决方案,但解释为什么它不起作用:如果您深入了解ConcurrentSkipListMap,您将看到获取对象检查内部索引结构并使用Comparable的compareTo方法。它不仅仅是使用只考虑id的hashCode方法(为了将你的id提供给adhoc创建的MyKey实例似乎是合理的)。 我也建议使用不同的方法。