关于排序:Java如何根据HashMap中的值返回前10个项目

Java How to return top 10 items based on value in a HashMap

所以我对Java非常陌生,因此我正在通过一个练习来战斗,把我的Python程序转换成Java。

我遇到了一个问题,我正试图从python复制行为,下面只返回按值排序的键,而不返回值:

1
popular_numbers = sorted(number_dict, key = number_dict.get, reverse = True)

在爪哇,我已经做了一点研究,还没有找到一个足够简单的样本作为NNB,比如我自己或者一个类似的方法。我找到了使用guava进行排序的示例,但排序似乎返回了按键排序的哈希图。

除上述之外,关于Python的其他好东西之一,我在Java中没有发现的是,能够轻松地返回排序值的子集。在python中,我可以简单地执行以下操作:

1
print"Top 10 Numbers: %s" % popular_numbers[:10]

在本例中,number_dict是键、值对的字典,其中key表示数字1..100,value是数字(key)出现的次数:

1
2
3
for n in numbers:
 if not n == '':
   number_dict[n] += 1

最终结果是:

Top 10 Numbers: ['27', '11', '5', '8', '16', '25', '1', '24', '32',
'20']

为了澄清,在Java中,我已经成功创建了一个哈希表,我成功地检查了数字并增加了键、值对的值。我现在只能继续排序,并根据值返回前10个数字(键)。


  • 把地图的entrySet()放进List中。
  • 使用Collections.sortComparator对该列表进行排序,Entry根据值对Entry进行排序。
  • 使用ListsubList(int, int)方法检索包含前10个元素的新列表。
  • 是的,它将比python详细得多。)


    用JAVA 8 +,获取中间列表的前10个元素:

    1
    list.stream().sorted().limit(10).collect(Collectors.toList());

    要获取映射键的前10个整数元素:

    1
    map.keySet().stream().sorted().limit(10).collect(Collectors.toMap(Function.identity(), map::get));


    使用SortedMap,调用values()。文件说明如下:

    埃多克斯1〔13〕

    只要您的比较器编写正确,您就可以迭代第一个n键。


    guava multiset非常适合您的用例,可以很好地替换您的hashmap。它是一个计算每个元素出现次数的集合。

    multisets有一个方法copyHighestCountFirst,它返回按count排序的不可变multiset。

    现在一些代码:

    1
    2
    3
    4
    Multiset<Integer> counter = HashMultiset.create();
    //add Integers
    ImmutableMultiset<Integer> sortedCount = Multisets.copyHighestCountFirst(counter);
    //iterate through sortedCount as needed

    尝试下一个:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public static void main(String[] args) {

        // Map for store the numbers
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();

        // Populate the map ...

        // Sort by the more popular number
        Set<Entry<Integer, Integer>> set = map.entrySet();
        List<Entry<Integer, Integer>> list = new ArrayList<>(set);
        Collections.sort(list, new Comparator<Entry<Integer, Integer>>() {
            @Override
            public int compare(Entry<Integer, Integer> a,
                    Entry<Integer, Integer> b) {
                return b.getValue() - a.getValue();
            }
        });


        // Output the top 10 numbers
        for (int i = 0; i < 10 && i < list.size(); i++) {
            System.out.println(list.get(i));
        }

    }


    EDCOX1的0个s在Java中是不排序的,因此没有一个好的方法来命令他们通过所有的键来进行蛮力搜索。尝试使用TreeMap:http://docs.oracle.com/javase/6/docs/api/java/util/treemap.html


    假设您的映射是这样定义的,并且您希望基于值进行排序:

    1
    2
    3
    4
    5
    HashMap<Integer, Integer> map= new HashMap<Integer, Integer>();
    //add values
    Collection<Integer> values= map.values();
    ArrayList<Integer> list= new ArrayList<Integer>(values);
    Collections.sort(list);

    现在,打印列表的前10个元素。

    1
    2
    3
    for (int i=0; i<10; i++) {
        System.out.println(list.get(i));
    }

    映射中的值实际上没有排序,因为HashMap根本没有排序(它根据键的哈希代码将值存储在存储桶中)。这段代码只显示了地图中10个最小的元素。

    编辑排序而不丢失键值对:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    //sorted tree map
    TreeMap<Integer, Integer> tree= new TreeMap<>();

    //iterate over a map
    Iteartor<Integer> it= map.keySet().iterator();
    while (it.hasNext()) {
        Integer key= it.next();
        tree.put(map.get(key), key);
    }

    现在,您有了已排序的TreeMap树,它从原始映射中反转了键值对,因此不会丢失信息。