4 回答

TA貢獻1825條經(jīng)驗 獲得超4個贊
再使用一組來存儲重復(fù)元素并打印該元素。嘗試這樣:
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條經(jīng)驗 獲得超8個贊
我并不完全清楚“僅使用接口”需要什么,Set但我假設(shè)這意味著重復(fù)的字符將在Set. 有幾種方法可以做到這一點。第一個是對輸入字符串的字符進行直接循環(huán)。它利用了以下功能:如果集合被修改,則Set.add返回;如果沒有,則返回;這意味著返回的操作是重復(fù)的。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;
}
有一種流式的方式可以做到這一點,本質(zhì)上與流形式表達的東西是一樣的:
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());
}
有些人可能會覺得這令人討厭,因為它的過濾操作會產(chǎn)生副作用。此外,如果并行運行,結(jié)果將需要類似于ConcurrentHashMap.newKeySet.
另一種方法是生成字符頻率表并刪除僅出現(xiàn)一次的所有條目:
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();
}
請注意,這在映射的值集合視圖上使用集合批量突變操作。為了確保映射是可變的,我使用了三參數(shù)重載groupingBy來指定映射的實現(xiàn)類型。
如果你不喜歡突變,有一個純流的方法可以做到這一點:
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條經(jīng)驗 獲得超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條經(jīng)驗 獲得超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);
}
}
}
添加回答
舉報