我有一个这样的哈希图。
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, 11java, 4c#, 2go, 2
这是我自己的attamp,但它根本无法工作......事实上,'compareTo'方法显示为红色(无法编译)......请有人帮我一些代码示例......我有点困惑如何使用比较器类来定制比较器。
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'方法显示为红色(无法编译)......请谁能帮我提供一些代码示例......我对如何使用比较器类自定义比较对象有点困惑......。
编译器在抱怨,因为你不能调用 "go",2; map.put("objective-c",11); map.put("c#",2); 现在我想...。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
如果它们的长度相等,则在词法上称为 "s"。
你把 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);
}
}
如果使用 树图 是 非强制性
解释: 定义: 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());
}
}