4 回答
TA贡献1825条经验 获得超4个赞
再使用一组来存储重复元素并打印该元素。尝试这样:
public static void duplicateString(String str) {
str=str.replaceAll(" ","");
char[] cArray = str.toCharArray();
Set<Character> set = new HashSet<Character>();
Set<Character> set1 = new HashSet<Character>();
for(char c:cArray) {
if(set.add(c)==false) {
if(set1.add(c) == true)
System.out.println(c);
}
}
}
TA贡献1858条经验 获得超8个赞
我并不完全清楚“仅使用接口”需要什么,Set但我假设这意味着重复的字符将在Set. 有几种方法可以做到这一点。第一个是对输入字符串的字符进行直接循环。它利用了以下功能:如果集合被修改,则Set.add返回;如果没有,则返回;这意味着返回的操作是重复的。truefalseaddfalse
static Set<Character> dups0(String input) {
Set<Character> dups = new HashSet<>();
Set<Character> seen = new HashSet<>();
for (char ch : input.toCharArray()) {
if (! seen.add(ch)) {
dups.add(ch);
}
}
return dups;
}
有一种流式的方式可以做到这一点,本质上与流形式表达的东西是一样的:
static Set<Character> dups1(String input) {
Set<Character> seen = new HashSet<>();
return input.chars()
.mapToObj(ch -> (char)ch)
.filter(ch -> !seen.add(ch))
.collect(toSet());
}
有些人可能会觉得这令人讨厌,因为它的过滤操作会产生副作用。此外,如果并行运行,结果将需要类似于ConcurrentHashMap.newKeySet.
另一种方法是生成字符频率表并删除仅出现一次的所有条目:
static Set<Character> dups2(String input) {
Map<Character, Long> map = input.chars()
.mapToObj(i -> (char)i)
.collect(groupingBy(ch -> ch, HashMap::new, counting()));
map.values().removeIf(v -> v == 1);
return map.keySet();
}
请注意,这在映射的值集合视图上使用集合批量突变操作。为了确保映射是可变的,我使用了三参数重载groupingBy来指定映射的实现类型。
如果你不喜欢突变,有一个纯流的方法可以做到这一点:
static Set<Character> dups3(String input) {
Map<Character, Long> map = input.chars()
.mapToObj(i -> (char)i)
.collect(groupingBy(ch -> ch, counting()));
return map.entrySet().stream()
.filter(entry -> entry.getValue() > 1)
.map(Map.Entry::getKey)
.collect(toSet());
}
TA贡献1906条经验 获得超10个赞
尝试一下:
public static void duplicateString(String str) {
Set<Character> firstTime = new HashSet<Character>();
Set<Character> reported = new HashSet<Character>();
char[] cArray = str.toCharArray();
for(char c:cArray) {
if (!firstTime.contains(c)) {
firstTime.add(c);
continue;
}
if (reported.contains(c)) { continue; }
reported.add(c);
System.out.println(c);
}
}
我进行了一些测试:
添加:10000000 次操作需要 52443260ns
包含:10000000 次操作需要 28209745ns
因此上面的代码虽然不短但速度最快。
TA贡献1789条经验 获得超10个赞
检查这个程序
public static void duplicateString(String str) {
char[] cArray = str.replaceAll("\\s+", "").toCharArray();
Set<Character> set = new HashSet<Character>();
Set<Character> alreadyExistingSet = new HashSet<Character>();
for (char c : cArray) {
if (set.add(c) == false && alreadyExistingSet.add(c) == true) {
System.out.print(c);
}
}
}
添加回答
举报