根据数字键的顺序在地图中排序

时间:2016-09-20 17:01:42

标签: java sorting

我有Map<String,Map<Integer,String>>

此地图中的示例数据

("aa" , ((3, "xx"),(5, "yy"),(1,"zz")))

("bb" , (5, "zz"))

此处内部地图的Integer键位于1到5之间。它基本上是优先级编号

现在我需要获取某个键的值(比如aa)。它应该从具有最高优先级编号(密钥)的内部地图返回值。

在上面的例子中,应该返回yy

注意:在地图中插入数据的顺序与内部地图键的顺序无关。

我该怎么做 -

  • 在填充地图数据的同时使用基于键的排序内部地图?
  • 将具有最高优先级值(本例中 5 )的地图重复到最低( 1,在这种情况下为)?
  • 按键的升序对内部地图进行排序并获取最后一个值?

3 个答案:

答案 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。