【问题标题】:How can you generate a list of N sorted keys of a hashmap, sorting by value?如何生成一个哈希映射的 N 个排序键的列表,按值排序?
【发布时间】:2013-11-08 01:54:45
【问题描述】:

我对Java不是很熟悉,我有点不确定如何将它从c#翻译成java。

Dictionary<string, int> myDictionary = GetDictionary();
int N = 10;

myDictionary
         .OrderByDescending(dictionaryEntry => dictionaryEntry.Value)
         .Take(N)
         .Select(dictionaryEntry => dictionaryEntry.Key)
         .ToList();

现在,我知道字典本身没有被排序,它只是一个新的 IEnumberable,没关系。

谢谢!

【问题讨论】:

    标签: c# java sorting hashmap


    【解决方案1】:

    我不是 C# 人,我从未使用过它,但如果我猜测一下,您似乎正在按地图的值按降序对地图进行排序,检索前 10 个元素,然后转换将这 10 个元素的键合并到一个列表中。

    如果已知这些值是不同的,那么这很简单——您只需转换为交换了键和值的 SortedMap。所以我假设这些值不是不同的,即相同的数字可能会出现多次。

    在这种情况下,它并不像 C# 示例中那么简单,而且绝对不会那么简单。我的第一个想法是使用自定义比较器创建一个排序集,其中集合中的每个元素都是地图中的 Map.Entry,其中键和值被交换。

    这实际上需要相当多的 Java 代码。这是一次尝试:

    // Create a SortedSet of the reversed entry set, with a custom comparator for sorting
    SortedSet<Map.Entry<Integer, String>> sortedSet = new TreeSet<Map.Entry<Integer, String>>(
            new Comparator<Map.Entry<Integer, String>>() {
        public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
            // sort by key, then by value --> in descending order
            int keyCompareResult = -o1.getKey().compareTo(o2.getKey()); // negate --> descending
            int valueCompareResult = o1.getValue().compareTo(o2.getValue());
            return keyCompareResult == 0 ? valueCompareResult : -keyCompareResult;
        }
    });
    
    // Add all entries of the map to the sorted set
    for (Map.Entry<String, Integer> entry : map.entrySet()) {
        Map.Entry<Integer, String> reversedEntry = new AbstractMap.SimpleEntry<Integer, String>(entry.getValue(), entry.getKey());
        sortedSet.add(reversedEntry);
    }
    
    // Convert the 10 first elements to the resulting list
    int N = 10;
    List<String> result = new ArrayList<String>(N);
    Iterator<Map.Entry<Integer,String>> iterator = sortedSet.iterator();
    while (iterator.hasNext() && result.size() < N) {
        Map.Entry<Integer, String> entry = iterator.next();
        result.add(entry.getValue());
    }
    

    【讨论】:

    • 谢谢!经过一番搜索后,我结束了类似的操作,但我不知道 SortedSet 类,所以我做了一个 ArrayList 为 Comparator 实现了一个小类,然后使用 Collections.sort( myArrayList, Collections.reverseOrder(new MapEntryComparator()));对于选择前 N 个元素,它几乎相同,但带有一个 for。为了完整起见,我会添加我的答案,但它与你的几乎相同,所以我会给你答案:)
    • 虽然如果有人知道更 LINQ-y / 功能性的方式来做到这一点,请添加答案!
    【解决方案2】:

    我想出了与 Steinar 建议的几乎相同的东西,如果您知道更 LINQ-y/功能性更强的方法,请也添加您的答案!

    //Convert to List of Map.Entry
    ArrayList<Map.Entry<String,Integer>> myArrayList = ArrayList<Map.Entry<String,Integer>>(myHashMap.entrySet());
    
    //Natural order is ascending, so we reverse the comparator to get it Descending.
    Collections.sort(myArrayList , Collections.reverseOrder(new EntryComparator()));
    
    //Create list and add Keys
    
    List<String> topNStrings =  new ArrayList<String>();
    
    for (int i = 0; i < N && i < myArrayList.size(); i++)
    {
      topNStrings.add(myArrayList.get(i).getKey());
    }
    

    并且有一个单独的小比较器类

    private class EntryComparator implements Comparator<Map.Entry<String,Integer>>
        {
        @Override
        public int compare(Map.Entry<String,Integer> x, Map.Entry<String,Integer> y)
        {
            return compare(x.getValue(), y.getValue());
        }
    
        private int compare(Integer a, Integer b)
        {
            return a < b ? -1
                    : a > b ? 1
                    : 0;
        }
    }
    

    【讨论】:

      【解决方案3】:

      让我们从您以某种方式获得的由HashMap&lt;String, Integer&gt; map 定义的任意 HashMap 开始。

      我们要对进行排序,然后得到第一个N值。

      int N = 10;
      
      List<Integer> values = new ArrayList<Integer>( map.values() );
      Collections.sort(values);
      List<Integer> N_values = values.subList(0, N);
      

      【讨论】:

      • 这是通过键(字符串)而不是值对哈希图进行排序
      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 2011-07-07
      • 1970-01-01
      • 2017-05-13
      相关资源
      最近更新 更多