所以这是我面临的问题,我试图实现一个HashMap,使用Id作为键,使用对象指针作为值。
在每个对象中,有两个整数,假设它们表示对象中定义的各种类别的投资额。
但是,我希望能够在访问键和对象的同时,对特定类别中的投资额进行排序并访问第n个元素。因此,它必须按每个投资额编制索引。
例子:
Id=1,对象:{Gas=2000,Tech=5000,Bank=1000}
id=2,对象:{gas=1000,tech=8000,bank=2000}
id=3,对象:{gas=4000,tech=6000,bank=3000}
所以,我希望能够通过id查找对象(简单)但我也希望能够做一些事情,比如gas[0]获得gas的最高投资(即id=3),tech[2]获得tech的第三高投资(即id=1)。
这样的事情应该使用什么样的数据结构?

最佳答案

您可以使用一个java.util.SortedSet和一个自定义Comparator来表示您想要的每个附加索引。

Map<Integer, MyClass> byId = new HashMap<Integer, MyClass>();
SortedSet<MyClass> byGas = new TreeSet<MyClass>(new MyGasComparator());
SortedSet<MyClass> byTech = new TreeSet<MyClass>(new MyTechComparator());
...

class MyGasComparator implements Comparator<MyClass> {
    @override
    public int compare(MyClass a, MyClass b) {
        int r = a.getGas() - b.getGas();
        if (r != 0) {
            return r;
        }

        // gas is equal, ensure fixed order
        return a.getId() - b.getId();
    }
}

...

在上面所示的比较器中,byGas().first()将是气体值最大的对象,byGas.iterator()byGas.toArray()都将返回按气体顺序降序排列的对象。只需交换比较器中的a和b就可以反转顺序。
另外,考虑将索引映射封装在另一个类中,该类负责添加、删除和查找各种索引类型的值。

09-06 14:42