是否可以强制 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 实例似乎是合理的)。 我也建议使用不同的方法。