在java中,从字符串中删除重复字符的最有效方法是什么?
我有一个helper函数,用于查找字符串中重复字符的索引。 现在,删除这些重复项的最佳方法是什么?在java中,从字符串中删除重复字符的最有效方法是什么?,java,performance,Java,Performance,我有一个helper函数,用于查找字符串中重复字符的索引。 现在,删除这些重复项的最佳方法是什么? 谢谢 这是我知道的最好的方法。它获取一个字符串,将其分隔为字符,将其放入哈希集中(非重复、有序),然后打印(或返回该字符串) 这是列出的方法中最好的一种 String example = "thiscode"; char[] chars = example.toCharArray(); Set<Character> str = new LinkedHashSet<Characte
谢谢 这是我知道的最好的方法。它获取一个字符串,将其分隔为字符,将其放入哈希集中(非重复、有序),然后打印(或返回该字符串) 这是列出的方法中最好的一种
String example = "thiscode";
char[] chars = example.toCharArray();
Set<Character> str = new LinkedHashSet<Character>();
for (char c : chars) {
str.add(c);
}
StringBuilder sb = new StringBuilder();
for (Character character : str) {
sb.append(character);
}
System.out.println(sb.toString());
希望这有帮助。另一种可能的解决方案:
数组。排序(charz)
在这里的一个答案的评论中,有人谈到在不改变索引的情况下从StringBuilder中删除字符而不会导致问题。所以我写了这篇文章。我并不是说这是处理字符串的最佳方式。我会使用链接集解决方案或类似的解决方案。(因此,不要对此投反对票或赞成票:) 在这里,我们循环StringBuilder长度-1,然后检查所有字符是否重复并删除它们。我们只转到-1,因为最后一个字符后面没有任何要检查的内容。len-1计算每次都在for循环中完成,因此在删除字符时它不会运行
public String removeDuplicates(String string) {
StringBuilder stringBuilder = new StringBuilder(string);
for (int x=0;x<stringBuilder.length()-1;x++) {
String character = Character.toString(stringBuilder.charAt(x));
int i;
while ((i = stringBuilder.indexOf(character, x+1)) != -1) {
stringBuilder.replace(i, i+1, "");
}
}
return stringBuilder.toString();
}
public String removeDuplicates(字符串){
StringBuilder StringBuilder=新的StringBuilder(字符串);
对于(int x=0;x,您可以创建一组使用的chracter,并利用add方法,因为如果该组已包含列出的值,则返回false,没有理由在元素上循环多次
String input = "somesortoftestwords";
Set<Character> charSet = new HashSet<Character>();
StringBuilder sb = new StringBuilder();
for (char c : input.toCharArray()) {
if (charSet.add(c)){
sb.append(c);
}
}
System.out.println(sb.toString());
String input=“somesortoftextwords”;
Set charSet=new HashSet();
StringBuilder sb=新的StringBuilder();
for(char c:input.toCharArray()){
如果(字符集添加(c)){
sb.附加(c);
}
}
System.out.println(sb.toString());
字符串
是不可变的,因此您不能从字符串
中删除字符。提示:就您的“最佳方式”而言我有一个类似的答案,但无需重复两次,也无需保持哈希集的顺序,因为您可以使用set.add方法来检查是否要在向集添加字符的同时添加字符。我这样做是作为面试准备的一部分,发现哈希集无法工作,因为它无法保持顺序。请使用LinkedHashSet而不是哈希集来维护插入顺序,否则{“bcdbcdbasbabcbdcbdsadas”->“bcdas”}失败。@jaamit“bcdas”是正确的输出,而且由于哈希集仅用于查看是否使用了字符,插入顺序完全无关,哈希集不用于输出。我想我应该给出更多细节……我的意思是{“bcdbcdbasbabcbdcbdsadas”->“bcdas”}是我的单元测试用例,在我使用HashSet时失败。在我使用LinkedHashSet时它通过了。`Set Set Set=new LinkedHashSet();for(Character c:str.tocharray()){if(!Set.contains(c))Set.add(c);}//Set有唯一的元素-转换为(Character c:Set){sb append(c)的输出字符串}`@jaamit为什么要创建第二个for循环,在我的示例中没有必要在hashmap上循环。我不明白为什么要第二次循环?Juat是为了让你可以出于某种原因使用linkedhashmap进行输出?我明白你的意思了……你的代码简洁明了,避免了两次循环。我错过了。谢谢
String example = "thiscode";
String empty = "";
boolean alphabet[] = new boolean[26];
for (char c : example.toCharArray())
if (alphabet[(int) ((c + "").toLowerCase().charAt(0) - 'a')] == false)
empty += c;
example = empty;
System.out.println(example);
public String removeDuplicates(String string) {
StringBuilder stringBuilder = new StringBuilder(string);
for (int x=0;x<stringBuilder.length()-1;x++) {
String character = Character.toString(stringBuilder.charAt(x));
int i;
while ((i = stringBuilder.indexOf(character, x+1)) != -1) {
stringBuilder.replace(i, i+1, "");
}
}
return stringBuilder.toString();
}
String input = "somesortoftestwords";
Set<Character> charSet = new HashSet<Character>();
StringBuilder sb = new StringBuilder();
for (char c : input.toCharArray()) {
if (charSet.add(c)){
sb.append(c);
}
}
System.out.println(sb.toString());