我有Map<String,Map<Integer,String>>
此地图中的示例数据
("aa" , ((3, "xx"),(5, "yy"),(1,"zz")))
("bb" , (5, "zz"))
此处内部地图的Integer键位于1到5之间。它基本上是优先级编号。
现在我需要获取某个键的值(比如aa
)。它应该从具有最高优先级编号(密钥)的内部地图返回值。
在上面的例子中,应该返回yy
。
注意:在地图中插入数据的顺序与内部地图键的顺序无关。
我该怎么做 -
答案 0 :(得分:2)
选项2&amp; 3效率较低,因为每次轮询值时都必须进行排序/迭代。
您可以使用TreeMap
实施选项#1,并在添加元素时为您处理所有排序。然后使用TreeMap#lastEntry()
获取具有最高键值的条目。
使用一些Java 8功能:
Map<String,TreeMap<Integer,String>> outerMap = new HashMap<>();
public void insert(String outerKey, Integer innerKey, String innerValue) {
outerMap.computeIfAbsent(outerKey, k -> new TreeMap<>())
.put(innerKey, innerValue);
}
public String pollHighest(String outerKey) {
return Optional.of(outerKey)
.map(outerMap::get)
.map(TreeMap::lastEntry)
.map(Map.Entry::getValue)
.orElse(null);
}
答案 1 :(得分:1)
选项#2在最坏的情况下会有O(n)
的复杂性。
选项#3需要在每个步骤进行排序。如果使用插入排序算法逐个插入元素,那么在最坏的情况下,这将是O(n)
。
对于内部地图,您可以使用TreeMap。它会为您保存数据。 TreeMap
保证log(n)
时间复杂度。对于您的情况,也可以使用优先级队列(使用最大堆)。
答案 2 :(得分:0)
如果在此地图上没有进行其他操作,最好使用选项#1按照要求构建地图。无需进一步迭代。
我建议在key的基础上使用treeMap作为innerMap。