[英]Removing the duplicates from the String in java
從java中給定的字符串中刪除重復項
例如:-如果我的字符串是“ cutcopypaste”
那么輸出應為“ uoyase”
輸入:-cutcopypaste;
輸出:-uoyase;
這是我寫的程序。 我應該做些什么改變?
但是我的輸出是這樣的:-cuttcoppyppastte
class Remove {
public static String remo(String st) {
char[] ch = st.toCharArray();
st = "";
String st1 = "";
for (int i = 0; i < ch.length; i++) {
for (int j = 1; j < ch.length; j++) {
if (ch[i] == ch[j]) {
st1 = st1 + ch[i];
} else {
st = st + ch[i];
}
}
}
return st;
}
public static void main(String[] args) {
String st1 = "cutcopypaste";
st1 = remo(st1);
}
}
您可以使用這種方法將字符串轉換為字符數組,例如.toCharArray()。
然后將char數組轉換為將刪除重復項的集合。
public static Set convertToSet(char[] charArray) {
// Result hashset
Set resultSet = new HashSet();
for (int i = 0; i < charArray.length; i++) {
resultSet.add(newCharacter(charArray[i]));
}
// Return result
return resultSet;
}
如果命令對您來說無關緊要,則可以嘗試以下代碼:
List<Character> result = input
.chars()
.mapToObj(el -> (char) el)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
.filter(el -> el.getValue() == 1L)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
我的方法是遍歷char數組並記住每個char出現的頻率。 在這種情況下,我們可以使用包裝類型Boolean
來為每個字符提供3種可能的狀態: null
=尚未發生, true
=發生一次, false
=發生多次。
為了保持這些狀態,我將使用LinkedHashMap
因為它保留了插入順序。 要獲取結果字符串,我們只需遍歷地圖的條目,過濾掉所有不為true
的狀態(即發生一次),然后將其連接為字符串。
public class Duplicate {
public static void main(String[] args) {
System.out.println(remo("cutcopypaste"));
}
public static String remo(String st) {
Map<Character, Boolean> occurredOnlyOnce = new LinkedHashMap<>(); //preserves insertion order
for(char c : st.toCharArray()) {
Boolean occurred = occurredOnlyOnce.get(c);
if(occurred == null) {
occurredOnlyOnce.put(c, true);
} else if(occurred) {
occurredOnlyOnce.put(c, false);
}
}
return occurredOnlyOnce.entrySet().stream()
.filter(e -> e.getValue())
.map(e -> e.getKey().toString())
.collect(Collectors.joining());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.