在Java中对HashMap值进行排序时没有返回正确的顺序

在Java中对HashMap值进行排序时没有返回正确的顺序,java,sorting,hashmap,Java,Sorting,Hashmap,我在使用Java中的值对HashMaps进行排序时遇到一些问题。 我的代码是: @SuppressWarnings("unchecked") Map<String, Integer> scores = ((HashMap<String, Integer>) prefs.get()); Map<String, Integer> sortedscores = sortByValues(scores);

我在使用
Java
中的值对
HashMaps
进行排序时遇到一些问题。 我的代码是:

 @SuppressWarnings("unchecked")
          Map<String, Integer> scores = ((HashMap<String, Integer>) prefs.get());
          Map<String, Integer> sortedscores = sortByValues(scores);
          printMap(scores);
          System.out.println("==============");
          printMap(sortedscores);
第一个是未排序的,第二个是已排序的。 我的问题是,第二个输出不符合DESC顺序(按值)

编辑: 如果我自己创建一个hasmap,它可以正常工作:

Map<String, Integer> unsortMap = new HashMap<String, Integer>();
        unsortMap.put("asd", 1);
        unsortMap.put("asd2r1", 5);
        unsortMap.put("house", 7);
        unsortMap.put("3", 124);
        unsortMap.put("7", 4);
        unsortMap.put("5", 6);
        unsortMap.put("6", 2);
        unsortMap.put("8", 0);
Map unsortMap=newhashmap();
反排序图。put(“asd”,1);
unsortMap.put(“asd2r1”,5);
放在地图上(“房子”,7);
反排序图。放置(“3”,124);
不排序图。放置(“7”,4);
反排序图。放置(“5”,6);
反排序图。放置(“6”,2);
反排序图。放置(“8”,0);

但是,如果我尝试这样做:
Map scores=((HashMap)prefs.get())我得到了wierd顺序。

您的比较器看起来不符合:


当两个条目相等时,为什么返回1?

基本上应该重写以下内容:

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 new LinkedHashMap<K,V>(sortedByValues);
Map sortedByValues=新树映射(valueComparator);
sortedByValues.putAll(地图);
返回新的LinkedHashMap(SortedByValue);
您有一个已排序的映射,然后将所有对放在一个新映射中,这样它们将再次被取消排序。尝试这样做:

Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
sortedByValues.putAll(map);
return sortedByValues;
Map sortedByValues=新树映射(valueComparator);
sortedByValues.putAll(地图);
返回SortedByValue;
找到了解决方案: 问题是它比较的是字符串而不是整数。我尝试的转换

Map<String, Integer> scores = ((HashMap<String, Integer>) prefs.get());

将hasmap转换为排序时,效果非常好。

好的,这里有什么问题吗?值应该按DESC顺序排序,但1037不是它应该位于的位置。如果排序顺序混乱,就像比较器中出现错误一样。我尝试过,但输出是一样的,除了丢失了重复的条目,但没有发生任何事情,输出是相同的
public int compare(K k1, K k2) {
    return map.get(k2).compareTo(map.get(k1));
}
Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
sortedByValues.putAll(map);
return new LinkedHashMap<K,V>(sortedByValues);
Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);
sortedByValues.putAll(map);
return sortedByValues;
Map<String, Integer> scores = ((HashMap<String, Integer>) prefs.get());
   for (@SuppressWarnings("rawtypes") Map.Entry entry : scores.entrySet()) {
       scoresInt.put(entry.getKey().toString(), Integer.parseInt(entry.getValue().toString()));
   }