java边学边练之String,Number,Math(1)计算字符串中重复字符

 

以下是我自己的的实现方式,最最最笨的方法!!!

public class demo {
public static void main(String[] args) {
String str = "gfhgdebhjf";
char[] ch = str.toCharArray();
for(int i= 0; i < ch.length; i ++){
char c = ch[i];
for(int j = i+1; j<ch.length; j++ ){
if(c == ch[j]){
System.out.println(c);
}
else{
continue;
}
}
}
}
}
参考答案给了两种方法:
(1)

public Map<Character, Integer> countDuplicateCharacters(String str) {

Map<Character, Integer> result = new HashMap<>();

// or use for(char ch: str.toCharArray()) { ... }
for (int i = 0; i<str.length(); i++) {
char ch = str.charAt(i);

result.compute(ch, (k, v) -> (v == null) ? 1 : ++v);
}

return result;
}

这个方法的主要实现思路是:将字符和它在字符串中出现的次数(利用HashMap的方式)存成键值对。

其中,你需要了解Java中的HashMap, (hashmap 是java提供的一种键值对的存储形式,其中,key 应该唯一,key和value都可以为空,指定key的value可以更改(采用compute方法)。

并且,需要熟知compute 方法,参考:Java HashMap compute() 方法 | 菜鸟教程 (runoob.com),补充说明:当一个空的hashMap使用compute方法时,会自动添加key和value。

(2)

public Map<Character, Long> countDuplicateCharacters(String str) {

Map<Character, Long> result = str.chars()
.mapToObj(c -> (char) c)
.collect(Collectors.groupingBy(c -> c, Collectors.counting()));

return result;
}

这个方法主要是使用java8新增的流来实现。

第一眼看到这个答案,我的大脑的第一反映是:我不会!!!

经过查阅相关资料了解流是什么?

流的概念很广泛,参考:Java8系列--Java Stream入门篇(什么是Stream)_高自强的博客-CSDN博客_stream是什么,已经解决了本题中流的疑惑。

用一句话概括:流就是集合和lambda表达式的合体,主要解决数据的筛选和过滤。

在此答案中,首先使用string的chars()方法将string类型的变量转换成IntStream,再通过IntStream的mapToObj()方法结合lambda表达式(c->(char)c )来将IntStream转换成Stream<Charater>

(未完待学习。。。。Java 的stream)

上一篇:HGAME 2022 Writeup


下一篇:Python模块之 combinations 可迭代对象iterable中选取r个单位进行组合