Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有唯一键的对的排序列表的Java结构建议_Java_Sorting_Hashmap_Sortedmap - Fatal编程技术网

具有唯一键的对的排序列表的Java结构建议

具有唯一键的对的排序列表的Java结构建议,java,sorting,hashmap,sortedmap,Java,Sorting,Hashmap,Sortedmap,一种结构k=>v(k和v是=0整数),其中所有k都是唯一的,而v可能相等(k1=>v和k2=>v)应按v值的升序排序,例如: 让我们有[35=>1,23=>4,9=>9,2=>14]并想插入一对新的20=>5,那么结果将是[35=>1,23=>4,20=>5,9=>9,2=>14] 我可以使用Java中最快的结构是什么,以便根据一些输入数据创建它,并从左侧以“一个接一个”的方式进一步迭代它分类地图?我不认为存在这样的结构 SortedMap不适合您,因为它使用键而不是值进行排序 我将使用Hash

一种结构
k=>v
k
v
=0
整数),其中所有
k
都是唯一的,而
v
可能相等(
k1=>v
k2=>v
)应按
v
值的升序排序,例如:

让我们有
[35=>1,23=>4,9=>9,2=>14]
并想插入一对新的
20=>5
,那么结果将是
[35=>1,23=>4,20=>5,9=>9,2=>14]


我可以使用Java中最快的结构是什么,以便根据一些输入数据创建它,并从左侧以“一个接一个”的方式进一步迭代它<代码>分类地图?

我不认为存在这样的结构

SortedMap不适合您,因为它使用键而不是值进行排序

我将使用HashMap并在一个附加方法中实现排序,该方法将entrySet复制到一个列表中。该列表将使用一个比较值的自定义比较器进行排序


如果性能是一个大问题,那么您应该考虑实现自己的结构。有很多可能做到这一点,我们不能说什么是最快的。这取决于您希望执行的操作的频率。

不久前,我遇到了类似的情况;我并行使用了两张地图:

  • A
    HashMap
    M,其中p是配对类型,可以通过它们的键找到配对

  • 一个
    TreeMap
    S,带有一个比较器,它先按值排序,然后按键排序,以便始终具有正确的排序顺序

通过并行维护这两个结构,可以始终对成对进行排序,而不必使用键作为排序值

要添加一对,请执行以下操作:

M.put(key, pair);
S.put(pair, pair);
要通过密钥获取配对,请执行以下操作:

M.get(key);
要删除一对,请执行以下操作:

P pair = M.get(key);
M.remove(key);
S.remove(pair);
要获取已排序的对列表,请执行以下操作:

S.keySet();
核心业务的平均复杂性为:

  • 添加:
    O(logn)
    TreeMap
  • 获取:
    O(1)
    HashMap
  • 删除:
    O(logn)
    TreeMap

    • 如果您不需要增量构建,我会:

      List<Pair> pairs = ...;
      Collections.sort(pairs, new Comparator<Pair>() {
          @Override public int compare(Pair p1, Pair p2) {
              return p1.v - p2.v;
          }
      }
      LinkedHashMap<Integer, Integer> map = new LinkedHashMap<>();
      map.addAll(pairs); // retains insertion order
      return map;
      
      列表对=。。。;
      Collections.sort(pairs,newcomparator(){
      @覆盖公共整数比较(对p1,对p2){
      返回p1.v-p2.v;
      }
      }
      LinkedHashMap=新建LinkedHashMap();
      map.addAll(pairs);//保留插入顺序
      返回图;
      
      TreeMap(SortedMap的具体实现)默认情况下,对键进行排序,而不是对值进行排序..您可以使用排序键;编辑,但对于排序值,您需要采取某种方法。键是唯一的,不应该排序,但值应该排序。TreeMap按键排序,而不是按值排序。可能重复+1:使用复合比较器的好主意:-)由于第二个映射只用于迭代,使用树集不是更容易吗?@meriton:
      TreeSet
      只是
      TreeMap
      的包装。我更喜欢使用TreeMap,因为它与
      HashMap
      的操作一致,并且具有更好的未来扩展性。它还为每个实例保存一个对象:-DI执行了您建议的操作。