【问题标题】:How to count the values of a key and sort?如何计算键的值并排序?
【发布时间】:2015-12-24 21:30:59
【问题描述】:

Sort a Map<Key, Value> by values (Java)

我的问题与上述不同。我想计算键值的出现次数,并按降序对键和值进行排序。

我有这个哈希图:

0=[1, 2], 1=[2, 3], 2=[4], 3=[4, 5], 4=[5], 5=[]
  • 我想要一个键和值列表,根据它所具有的值的计数按降序排序。最终名单应该是 0=[1, 2], 1=[3, 2], 3=[4,5], 2=[4], 4=[5], 5=[]

  • 键和值应根据以下排列: 0 有两个值,1 有两个值,3 有两个值,2 有一个值,4 有一个值,5 没有,以此类推。

  • 注意:键和值都是根据计数排列的。

我只是根据值的计数对键进行排序

Map<Integer, Integer> map_degree = new HashMap<Integer, Integer>();

    for (Entry<Integer, ArrayList<Integer>> entry : list.entrySet()) {

        ArrayList<Integer> value=entry.getValue();
        int degree= value.size(); 
        int key=entry.getKey();
        map_degree.put(key,degree);

        }


       System.out.println("The mapping"+list);
       System.out.println("Before sorting" +   map_degree);
       System.out.println("After sorting descindeng order");
       Map<Integer, Integer> sortedVertex = sortByComparator(map_degree);
       System.out.println(sortedVertex); 





   }

   private static Map<Integer, Integer> sortByComparator(Map<Integer, Integer> map_degree)
   {

       LinkedList<Entry<Integer, Integer>> list_sorting = new LinkedList<Entry<Integer, Integer>>(map_degree.entrySet());

       // Sorting the list based on values
       Collections.sort(list_sorting, new Comparator<Entry<Integer, Integer>>()
       {
           public int compare(Entry<Integer, Integer> o1,
                   Entry<Integer, Integer> o2)
           {

               {    
                   // returns descending order
                   return o2.getValue().compareTo(o1.getValue());

               }
           }
       });



       // Maintaining insertion order with the help of LinkedList
       Map<Integer, Integer> sortedMap = new LinkedHashMap<Integer, Integer>();

       for (Entry<Integer, Integer> entry : list_sorting)
       {
           sortedMap.put(entry.getKey(), entry.getValue());
       }

       return sortedMap;

   }

输出是(键被排序并与值的计数映射)

Before sorting{0=2, 1=2, 2=1, 3=2, 4=1, 5=0}
After sorting descindeng order
{0=2, 1=2, 3=2, 2=1, 4=1, 5=0}

我怎样才能对键的值进行排序,以便最终得到 0=[1, 2], 1=[3, 2], 3=[4,5], 2=[4], 4=[5], 5=[] ?

【问题讨论】:

  • @mawalker 不一样。我想根据值的计数来排列键和值。
  • 这仍然是一个“排序”,您只是想对密钥/对集的不同部分进行排序。
  • @priya,不,这并没有什么不同。这是同样的问题,您只是对值的属性(列表的大小)而不是值本身进行排序。

标签: java sorting hashmap


【解决方案1】:

试试这个。

    Map<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>() {{
        put(0, Arrays.asList(1, 2));
        put(1, Arrays.asList(2, 3));
        put(2, Arrays.asList(4));
        put(3, Arrays.asList(4, 5));
        put(4, Arrays.asList(5));
        put(5, Arrays.asList());
    }};
    System.out.println("Before " + map);
    Map<Integer, List<Integer>> sorted = map.entrySet().stream()
        .peek(e -> e.getValue().sort((a, b) -> map.get(b).size() - map.get(a).size()))      // sort values descending
        .sorted((a, b) -> b.getValue().size() - a.getValue().size())    // sort keys descending
        .collect(LinkedHashMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), (m0, m1) -> m0.putAll(m1));
    System.out.println("After  " + sorted);

结果:

Before {0=[1, 2], 1=[2, 3], 2=[4], 3=[4, 5], 4=[5], 5=[]}
After  {0=[1, 2], 1=[3, 2], 3=[4, 5], 2=[4], 4=[5], 5=[]}

【讨论】:

  • 谢谢!!。键的顺序是正确的,但值的顺序应该是 0=[1, 2], 1=[3, 2], 3=[4,5], 2=[4], 4=[5], 5=[] 。例如: 3=[4,5] 而不是 3=[5, 4] 因为 4 有一个值而 5 没有任何值。 0=[1, 2] 而不是 0=[2, 1] 因为 1 有两个值,而 2 只有一个值。 (应该按映射值的降序排列)。
  • 我问了一个相关的问题。你能否也检查一下这个链接。 link。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2021-11-03
  • 2017-10-08
  • 1970-01-01
  • 2010-10-30
  • 2016-03-03
  • 2021-01-06
  • 2012-12-27
  • 2018-11-20
相关资源
最近更新 更多