Java 小模块之--统计字符串中元素个数
曾经看过我Stream或者Guava类库等文章的小伙伴应该很明白我这篇博文的意义所在了
一是给读者提供综合的博文入口 二是自己也总结一下思路
ps: 之前没看过小编文章的小伙伴也不要紧 可以先看下本文所介绍的几种处理方法 如果觉得还不错 可以点击文章末尾的链接跳转具体页面进行探讨
普通方式(Map)
Map map1=new TreeMap<>();
String str="112221324kassxsbx";
int count;
//遍历字符串 用字符串指定下标的值做运算
for(int i=0;i
//每次循环前初始化count的值
count=1;
//判断map集合中是否存在i下标对应的字符串的值 不存在则将count=1 存入
if(!map1.containsKey(str.charAt(i))) {map1.put(str.charAt(i), count);}
//如果存在 则把count+1后存入
else {
count+=map1.get(str.charAt(i));
map1.put(str.charAt(i), count);
}
}
//遍历map集合
map1.forEach((k,v)->log(k+"出现次数"+v));
// 1出现次数3
// 2出现次数4
// 3出现次数1
// 4出现次数1
// a出现次数1
// b出现次数1
// k出现次数1
// s出现次数3
// x出现次数2
jdk8 Stream处理
String str="1233ADddsd";
/**这里将字符串转换为字符数组再转换为集合
利用了Hutool的万能转换器的技术*/
var treemap=new TreeMap<>(toList(convert(char[].class, str))
//将集合转换为Stream
.stream()
//排序Stream中的元素
.sorted()
//利用数据分组和分组后子集处理技术
//将数据按照Stream中每个元素本身进行分组 并将每组元素个数返回
.collect(Collectors.groupingBy(ic->ic,Collectors.counting())));
//遍历集合
treemap.forEach((k,v)->log(k+"出现的次数"+v));
// 1出现的次数1
// 2出现的次数1
// 3出现的次数2
// A出现的次数1
// D出现的次数1
// d出现的次数3
// s出现的次数1
是不是觉得这样已经简便了很多 但是不要急 我们有更好的
Guava 类库处理
String string="1234234qwew";
//利用Guava中的新集合类型 Multiset 存储数据的特性
Multiset create = HashMultiset.create();
//字符串转换为集合的技术 依旧利用Hutool中的万能转换器 实在是方便啊!!!
create.addAll(toList(convert(char[].class,string)));
//结合Stream的查重和排序对集合中元素进行过滤
create.stream().distinct().sorted().forEach((ss)->log(ss+"出现和贺词"+create.count(ss)));
// 1出现和贺词1
// 2出现和贺词2
// 3出现和贺词2
// 4出现和贺词2
// e出现和贺词1
// q出现和贺词1
// w出现和贺词2
到这里代码就又简便高级许多吧 但是我们还有更好的
Hutool 类库处理
String string="1234234AqAw34qw";
/**利用 IterUtil 下的countMap :
根据集合返回一个元素计数的Map,
所谓元素计数就是假如这个集合中某个元素出现了n次,
那将这个元素做为key,n做为value*/
Map, Integer> countMap =new TreeMap(countMap(toList(convert(char[].class,string))));
countMap.forEach((k,v)->log(k+" 出现了几次: "+v));
// 1 出现了几次: 1
// 2 出现了几次: 2
// 3 出现了几次: 3
// 4 出现了几次: 3
// A 出现了几次: 2
// q 出现了几次: 2
// w 出现了几次: 2
最后这一行代码的解决方式大家可否喜欢呐!!!