根据出现顺序排列对象的Java数据结构

时间:2017-03-24 01:04:22

标签: java data-structures

是否存在数据结构,以便我可以向其输入所有对象,然后它将根据出现次数(例如以降序)返回对象。我能想到的只是使用哈希映射。哈希映射的关键是对象,值是对象的出现。每次输入一个对象时,我都会增加相应键的值。但是,这样,如果我想根据事件的降序输出对象,我需要遍历一次哈希映射。有没有更有效的方法在Java中实现它?

1 个答案:

答案 0 :(得分:0)

SortedMap可能是您最好的选择。您可以编写自己的比较器,以便按照您希望的方式对其进行排序。

编辑:因为似乎有混淆,这是一个按要求降序排序的例子。

import java.util.*;
public class TestSortedMap {

    private static class CountComparator implements Comparator<String> {

        Map<String, Integer> map;
        public CountComparator(Map<String, Integer> map) {
            this.map = map;
        }

        public int compare(String a, String b) {
            if (map.get(a) < map.get(b)) return 1;
            else if (map.get(a) > map.get(b)) return -1;
            return 0;
        }
    }

    public static void main(String[] args) {

        Map<String, Integer> testInput = new HashMap<>();
        testInput.put("Hello", 10);
        testInput.put("World", 0);
        testInput.put("Let's", 40);
        testInput.put("Party", 30);
        System.out.println("Unordered:");
        for (String key: testInput.keySet()) {
            System.out.println("Key: " + key + " | Value: " + testInput.get(key));
        }

        CountComparator countComparator = new CountComparator(testInput);
        SortedMap<String, Integer> sortedMap = new TreeMap<>(countComparator);
        sortedMap.putAll(testInput);

        System.out.println("Ordered:");
        for (String key: sortedMap.keySet()) {
            System.out.println("Key: " + key + " | Value: " + sortedMap.get(key));
        }
    }
}

结果集:

Unordered:
Key: Party | Value: 30
Key: Hello | Value: 10
Key: Let's | Value: 40
Key: World | Value: 0
Ordered:
Key: Let's | Value: 40
Key: Party | Value: 30
Key: Hello | Value: 10
Key: World | Value: 0