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

标签 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 }

因此,我希望能够通过对象的 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/

相关文章:

java - 从命令行获取文件路径并在 "file"构造函数中使用它?

java - 如何确定十六进制字符串中是否设置了某个位?

java - 我怎样才能将一个物体设置为焦点

c++ - 该算法获取所有字梯的时间复杂度是多少?

algorithm - 更新树并跟踪某些子树节点的变化

java - 如何在加载到 pojo 时跳过 xml 元素(在 xstream/jaxb 中)

database - akinator 正在与数据库一起运行?

arrays - 找出数组中满足 i<j 和 a[i]>a[j] 的 (i,j) 对的总数

javascript - 添加两个链表并在javascript中的新链表讨论中输出结果

ruby - Ruby 数据结构库的优化设计