是否可以强制Map以一种方式排序,但以另一种方式获取值?

时间:2017-09-03 00:07:26

标签: java sorting dictionary comparator comparable

我需要一个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)));

在这种情况下是否有解决方法?

1 个答案:

答案 0 :(得分:1)

您的答案没有真正的解决方案,但解释为什么它不起作用:如果您深入了解ConcurrentSkipListMap,您将看到获取对象检查内部索引结构并使用Comparable的compareTo方法。它不仅仅是使用只考虑id的hashCode方法(为了将你的id提供给adhoc创建的MyKey实例似乎是合理的)。 我也建议使用不同的方法。