做一个题,统计字符串中字母出现次数并排序。
使用sort()排序
// 统计字符串有多少重复值
public static void countMap() {
long start = System.currentTimeMillis();
// 定义字符串
String str = "asldkqiycaxhckqowiudockashdiqwdyaiyrdcea";
// 定义map
Map<Character, Integer> map = new LinkedHashMap<>();
// 遍历字符串,获取值并存入map
for (int i = 0; i < str.length(); i++) {
char s = str.charAt(i);
if (map.get(str.charAt(i)) != null) {
// map中有值
map.put(s, map.get(s) + 1);
}else {
// map中无值
map.put(s, 1);
}
}
// 对map进行排序
// 将map转换成list
List<Map.Entry<Character, Integer>> list = new ArrayList<>(map.entrySet());
// 对list进行降序排序,如果值相同,对键进行升序排序
list.sort((o1, o2) -> {
int result = o2.getValue().compareTo(o1.getValue());
return result == 0 ? o1.getKey().compareTo(o2.getKey()) : result;
});
// 清空原有map信息
map.clear();
for (Map.Entry<Character, Integer> m : list) {
map.put(m.getKey(), m.getValue());
}
// 输出新map
System.out.println(map);
long end = System.currentTimeMillis();
System.out.println("List总耗时:" + (end - start));
}
创建TreeSet(Comparator)进行排序
// set统计字符串并排序
public static void countSet() {
long start = System.currentTimeMillis();
// 定义字符串
String str = "asldkqiycaxhckqowiudockashdiqwdyaiyrdcea";
// 定义map
Map<Character, Integer> map = new LinkedHashMap<>();
// 遍历字符串,获取值并存入map
for (int i = 0; i < str.length(); i++) {
char s = str.charAt(i);
if (map.get(str.charAt(i)) != null) {
// map中有值
map.put(s, map.get(s) + 1);
} else {
// map中无值
map.put(s, 1);
}
}
// 统计重复元素
TreeSet<Map.Entry<Character, Integer>> treeSet = new TreeSet<>(new Comparator<Map.Entry<Character, Integer>>() {
@Override
public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
int result = o2.getValue() - o1.getValue();
return result == 0 ? o1.getKey() - o2.getKey() : result;
}
});
treeSet.addAll(map.entrySet());
// 清空map原有信息
map.clear();
for (Map.Entry<Character, Integer> m : treeSet) {
map.put(m.getKey(), m.getValue());
}
System.out.println(map);
long end = System.currentTimeMillis();
System.out.println("Set总耗时:" + (end - start));
}
}
在main中运行
public static void main(String[] args) {
System.out.println("统计排序:\n");
countMap();
System.out.println();
countSet();
}
结果:
可以看出,对map集合进行排序时,通过TreeSet方式排序是比较快的。
猜想:
1、一个是所有值插入后,遍历list进行排序;一个是在插值时进行排序,所以TreeSet方式更快。
2、Set集合与Map集合键的特性一致,都是不允许重复值存在,所以Set集合排序更快?
具体原因只能等以后在研究了,先将就着用哈哈哈哈。