2010-11-10 76 views
2

所以这里是我面临的问题,我试图实现一个HashMap使用Id作为关键,并且一个对象指针作为值。Java:多索引排序缓存或SortedMap与索引访问

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

但是,我希望能够对特定类别中的投资金额进行排序,并访问第N个元素,同时访问密钥和对象。所以它必须按照每个投资金额进行索引。

实施例:
ID = 1,对象:{气体= 2000,技术= 5000,银行= 1000}
ID = 2,对象:{气体= 1000,技术= 8000,银行= 2000}
Id = 3,Object:{Gas = 4000,Tech = 6000,Bank = 3000}

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

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

回答

2

你可以使用一个java.util.SortedSe吨与定制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即可逆转排序。

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