按字母顺序排列地图的各个部分

时间:2016-01-16 07:58:52

标签: java list sorting dictionary hashmap

我已按字母顺序阅读有关排序列表的内容,例如:Hashmap sortingSorting Maps

我有一个Map<String, Integer>,其值为

Tarantulas, 6 
Lions, 5 
Snakes, 2 
Zoopies, 2 
Zappin, 2 
Chapas, 1 
Zong Zwing, 1 
Chingos, 1 
Chapis, 1 
Grouches, 0 

我需要(仅)按字母顺序对具有相同点的部分进行排序。这是样本数据,因此不会知道Map中的实际值,因此需要根据存在的任何值进行排序。我已使用以下方法对值进行分组/排序:

 public <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) {
        Comparator<K> valueComparator = new Comparator<K>() {
            public int compare(K k1, K k2) {
                int compare = map.get(k2).compareTo(map.get(k1));
                if (compare == 0) {
                    return 1;
                } else {
                    return compare;
                }
            }
        };
        Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
        sortedByValues.putAll(map);
        return sortedByValues;
    }

这是预期的结果:

Tarantulas, 6 
Lions, 5 
Snakes, 2 
Zappin, 2 
Zoopies, 2 
Chapas, 1 
Chapis, 1 
Chingos, 1 
Zong Zwing, 1 
Grouches, 0 

所以问题是:我如何只对地图中具有相同点(整数值)的那些部分进行排序,并将其余部分保留原样?

我正在使用Java 7。

2 个答案:

答案 0 :(得分:2)

以下是如何使用比较器的示例。排序后,您可以将集合中的所有条目放入LinkedHashMap中,以保留元素的顺序。

public static void main(String[] args) {

    Map<String,Integer> map = new HashMap<String, Integer>();

    map.put("Tarantulas", 6);
    map.put("Lions", 5);
    map.put("Snakes", 2);
    map.put("Zoopies", 2);
    map.put("Zappin", 2);
    map.put("Chapas", 1);
    map.put("Zong Zwing", 1);
    map.put("Chingos", 1);
    map.put("Chapis", 1);
    map.put("Grouches", 0);

    SortedSet<Map.Entry<String, Integer>> sortedSet = new TreeSet<>(new Comparator<Map.Entry<String,Integer>>() {
        @Override
        public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {

            int result = o1.getValue().compareTo(o2.getValue());
            result*=-1;
            if(result==0)
                result = o1.getKey().compareTo(o2.getKey());

            return result;
        }
    });

    sortedSet.addAll(map.entrySet());


    for(Entry<String, Integer> entry:sortedSet)
        System.out.println(entry.getKey()+"="+entry.getValue());

}

答案 1 :(得分:1)

尝试:

public <K  extends Comparable<K>, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) {
    Comparator<K> valueComparator = new Comparator<K>() {
        public int compare(K k1, K k2) {
            int compare = map.get(k2).compareTo(map.get(k1));
            if (compare == 0) {
                return k1.compareTo(k2); // <- To sort alphabetically
            } else {
                return compare;
            }
        }
    };
    Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
    sortedByValues.putAll(map);
    return sortedByValues;
}