2016-01-16 72 views
-1

我读过有关排序名单按字母顺序,如:Hashmap sortingSorting Maps排序部分按字母顺序

我有一个值,如

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

我需要一个Map<String, Integer>(只)排序按字母顺序排列相同点的部分。这是样本数据,因此无法知道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

+0

使用地图是强制性的吗?我会使用一组对象来代替。 – SimoV8

+0

我用了一个比较器。将该代码添加到问题中,但我不认为它可能有用。您可以看到Map按照值排序,并且Map中的整数值被分组在一起。 –

+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; 
} 
+0

这将旧地图,新地图和其中的条目结合在一起,使整个事物几乎是只读的。如果做了任何更改,就会出现一致性错误。 – Henry

1

下面是如何使用比较例子。排序后,您可以将集合中的所有条目放入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()); 

} 
+0

为什么不使用'List'作为结果结构? – Henry

+1

然后他失去了地图功能。 –