这就是我面临的问题,我正在尝试使用 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 }
因此,我希望能够通过对象的 ID 进行查找(简单)。但我也希望能够做一些类似 Gas[0] 的事情来获得 gas 的最高投资(即 Id=3),Tech[2] 以获得第三高的技术投资(即 Id=1)。
像这样的东西应该使用什么样的数据结构?
最佳答案
你可以使用 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()
将是具有最大 gas 值的对象,byGas.iterator()
和 byGas.toArray()
会返回按 Gas 降序排序的对象。只需交换比较器中的 a 和 b 即可颠倒顺序。
另外,考虑将索引映射封装在另一个负责添加、删除和查找各种索引类型的值的类中。
关于Java:多索引排序缓存或带索引访问的 SortedMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4148431/