Java:多索引排序缓存或带索引访问的SortedMap

时间:2010-11-10 19:47:44

标签: java algorithm data-structures

所以这是我面临的问题,我正在尝试使用Id作为键来实现HashMap,并使用对象指针作为值。

在每个对象中,有几个整数,假设它们代表对象中定义的各种类别的投资金额。

但是,我希望能够在访问密钥和对象时对特定类别中的投资金额进行排序并访问第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}

所以,我希望能够通过Ids对对象进行查找(简单)。但我也希望能够做一些像Gas [0]这样的事情来获得天然气的最高投资(即Id = 3),Tech [2]以获得第三高的技术投资(即Id = 1)。

这样的事情应该使用什么样的数据结构?

1 个答案:

答案 0 :(得分:2)

您可以为所需的每个附加索引使用java.util.SortedSe t和自定义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()将按降序返回Gas排序的对象。只需在比较器中交换a和b即可逆转排序。

另外,请考虑将索引映射封装在另一个类中,该类负责添加,删除和查找各种索引类型的值。