java - map 按值集合的大小排序

标签 java dictionary java-7 treemap sortedmap

我正在尝试排序 map Map<Integer,Set<Integer>>它使元素根据 size() 排序值集。

实际上,这是一个节点到连接到该节点的其他节点的映射。我想快速(O(logn))访问具有最多边的节点而不必每次都排序

例如顺序应该是:

3 => {1,2,4,5}
12 => {1,2,3}
14 => {3,2,3}
65 => {3,8}
6 => {2}
2 => {5}

TreeMap不会这样做,因为我无法根据值进行排序,我可能需要滚动一些自定义内容。

编辑:集合的大小确实可能会发生变化,这可能会使事情变得更加复杂

实现这一目标的最简单方法是什么?

最佳答案

这是一个如何使用两个集合进行排序的示例。一组按 Set::size 排序,另一组只是带有整数索引的普通 Map。要使用此功能,您必须在两个映射中保留相同的键/值对。

我不确定是否建议尝试用它制作一张 map 。它有两次查找,按索引和按大小,因此它并不像常规 map 那样工作。这将取决于您的使用模型。

package quicktest;

import static java.util.Comparator.comparing;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapTest
{
   public static void main(String[] args) {
      TreeMap<Integer,Set<Integer>> index = new TreeMap<>();
      TreeMap<Set<Integer>,Integer> size = new TreeMap<>( comparing( Set::size ) );

      for( int i = 0; i < 5; i++ ) { 
         Set<Integer> set = new HashSet<>();
         for( int val = 0; val <= i; val++ ) {
            set.add( val );
         }
         index.put( i, set );
         size.put( set, i );
      }
      System.out.println( size.lastEntry() ); // largest set size
      System.out.println( index.get( 2 ) );  // random index
   }
}

关于java - map 按值集合的大小排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34497798/

相关文章:

java - 如何使用 SpriteBatch 绘制方法

java - Spring 4 + Hibernate 中 starter bean 的事务管理

java - 有没有办法在不创建新的临时 ArrayList 的情况下更改 ArrayList 的泛型类型?

Python,记录 : use custom handler with dictionary configuration?

java - 如何查找路径是否已用作符号链接(symbolic link)的源

java.security.InvalidAlgorithmParameterException : parameter object not a ECParameterSpec

java - 使用 Eclipse 为 java 6 编译 java 7

java - 使用多态性初始化对象列表

python - 在Python中构建嵌套字典从文件中逐行读取

python - 找到关于特定键的字典列表的最小值