我有一个这样的哈希图:
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顺序进行排序。所以我期望得到的结果是:
打印结果:目标-c,11java,4c#,2go,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"方法显示为红色(无法编译)。。。。请有人帮我举一些代码示例。。。我对如何使用comparator类自定义comparator对象有点困惑。。。
编译器正在抱怨,因为您无法在int
上调用compareTo
。正确的地图排序方式如下:
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
的长度相等,则第三个条件将以字典方式比较它们。
您调用String#length()
,它返回一个基元int
。您需要静态方法Integer.compare(int,int)
。如果你使用的是Java 8,你可以省去很多打字:
Map<String,Integer> treeMap = new TreeMap<>(
Comparator.comparingInt(String::length)
.thenComparing(Function.identity()));
public int compare(String o1, String o2) {
return o1.length() == o2.length() ? o1.compareTo(o2) : o1.length() - o2.length();
}
因为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);
}
}
如果树映射不是强制性的
Explantion:定义一个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());
比较器应为:
new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
}