我有一个这样的哈希图:
HashMap<String,Integer> map = new HashMap<String,Integer>();
map.put("java",4);
map.put("go",2);
map.put("objective-c",11);
map.put("c#",2);
现在我想按照其密钥长度对此映射进行排序,如果两个密钥长度相等(例如go和c#都是长度2),则按alphba顺序排序。 所以我期望得到的结果是:
印刷结果: objective-c,11 java,4 c#,2 去,2
这是我自己的玩具,但它根本不起作用......
HashMap<String,Integer> map = new HashMap<String,Integer>();
map.put("java",4);
map.put("go",2);
map.put("objective-c",11);
map.put("c#",2);
Map<String,Integer> treeMap = new TreeMap<String, Integer>(
new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.length().compareTo(s2.length());
}
}
);
实际上'compareTo'方法显示为红色(无法编译).... 请有人帮我一些代码示例...我对如何使用比较器类来自定义比较对象有点困惑...
答案 0 :(得分:13)
编译器抱怨,因为您无法在compareTo
上致电int
。对地图进行排序的正确方法如下:
Map<String, Integer> treeMap = new TreeMap<String, Integer>(
new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
if (s1.length() > s2.length()) {
return -1;
} else if (s1.length() < s2.length()) {
return 1;
} else {
return s1.compareTo(s2);
}
}
});
前两个条件比较两个String
的长度,并相应地返回正数或负数。如果长度相等,第三个条件将按字典顺序比较String
。
答案 1 :(得分:4)
您致电String#length()
,它会返回原始int
。您需要静态方法Integer.compare(int,int)
。如果您使用的是Java 8,则可以节省大量的输入:
Map<String,Integer> treeMap = new TreeMap<>(
Comparator.comparingInt(String::length)
.thenComparing(Function.identity()));
答案 2 :(得分:2)
因为length()
没有定义compareTo
方法,这就是您看到错误的原因。要更正它,请使用下面的Integer.compare(s1.length(), s2.length());
更新代码
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class Test {
public static void main(String[] args) {
HashMap<String,Integer> map = new HashMap<String,Integer>();
map.put("java",4);
map.put("go",2);
map.put("objective-c",11);
map.put("c#",2);
Map<String,Integer> treeMap = new TreeMap<String, Integer>(
new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
}
);
treeMap.putAll(map);
System.out.println(treeMap);
}
}
答案 3 :(得分:1)
如果使用 TreeMap 不是强制
说明:定义Comaprator
,然后定义一个列表,以便我们可以将所有地图条目添加到列表中。最后,按定义的Comaprator
<强>代码强>:
Comparator<Map.Entry<String,Integer>> byMapValues =
(Map.Entry<String,Integer> left, Map.Entry<String,Integer> right) ->left.getValue().compareTo(right.getValue());
List<Map.Entry<String,Integer>> list = new ArrayList<>();
list.addAll(map.entrySet());
Collections.sort(list, byMapValues);
list.forEach( i -> System.out.println(i));
<强>输出强>:
c#=2
go=2
java=4
objective-c=11
注意:按数字排序
如果需要根据键进行比较,可以使用以下行。
Comparator<Map.Entry<String,Integer>> byMapKeys =
(Map.Entry<String,Integer> left, Map.Entry<String,Integer> right) -> left.getKey().compareTo(right.getKey());
答案 4 :(得分:1)
public int compare(String o1, String o2) {
return o1.length() == o2.length() ? o1.compareTo(o2) : o1.length() - o2.length();
}
答案 5 :(得分:-1)
比较者应该是:
new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
}