是否可以强制 Map 以一种方式排序,但以另一种方式获取值?
Is it possible to force Map be sorted in one way, but get values in another way?
我需要一个 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)));
在这种情况下有什么解决方法吗?
您的答案没有真正的解决方案,但解释了为什么它不起作用:如果您深入研究 ConcurrentSkipListMap,您会发现获取对象会检查内部索引结构并使用 Comparable 的 compareTo 方法。它不仅仅是使用仅考虑 id 的 hashCode 方法(为此,将您的 id 仅提供给临时创建的 MyKey 实例似乎是合理的)。
我也建议使用不同的方法。
我需要一个 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)));
在这种情况下有什么解决方法吗?
您的答案没有真正的解决方案,但解释了为什么它不起作用:如果您深入研究 ConcurrentSkipListMap,您会发现获取对象会检查内部索引结构并使用 Comparable 的 compareTo 方法。它不仅仅是使用仅考虑 id 的 hashCode 方法(为此,将您的 id 仅提供给临时创建的 MyKey 实例似乎是合理的)。 我也建议使用不同的方法。