从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);
}
}
答案 0 :(得分:0)
您可以使用此方法将字符串转换为字符数组,如.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;
}
答案 1 :(得分:0)
如果订单对您无关紧要,那么您可以试试这段代码:
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());
答案 2 :(得分:0)
我的方法是迭代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());
}
}