在java中,从字符串中删除重复字符的最有效方法是什么?

时间:2015-03-17 02:03:21

标签: java performance

我有一个辅助函数,可以在String中查找重复字符的索引。 现在最好的方法是删除这些重复项? 谢谢!

4 个答案:

答案 0 :(得分:1)

这是我所知道的最佳方式。它需要一个字符串,将其分成字符,将其放入一个hashset(非重复,有序)然后打印(或者可以返回字符串。

这是列出

的最佳方法
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());

可替换地:

public static String convert(String example){
    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);
    }
    return sb.toString();
}

另一种方法:

    String example = "thiscode";
    StringBuilder sb = new StringBuilder(example);
    for (int i=0; i<example.length(); i++)                            //itterate throught the characters
        if (!sb.toString().contains(example.charAt(i) + ""))          //determine if its in the stringbuilder
            sb.append(example.charAt(i));                             //if not add it
    example = sb.toString();                                          //take result
    System.out.println(example);

低效但易于实施

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);

希望这有帮助。

答案 1 :(得分:1)

您可以创建一组使用的字符并使用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());

答案 2 :(得分:0)

另一种可能的解决方案:

  1. 将字符串转换为字符

    char [] charz = inputString.toCharArray();

  2. 对字符进行排序

    Arrays.sort(charz);

  3. 现在使用循环并检查重复项

答案 3 :(得分:0)

在其中一个答案的评论中,有人谈到从StringBuilder中删除字符而没有变化的索引导致问题。所以我写了这个。我并不是说这是处理String的最佳方法。我会使用Linked Set解决方案或类似的东西。 (所以不要拒绝投票 - 或者说不管怎么说:)

这里我们循环StringBuilder长度为-1并检查所有字符后复制并删除它们。我们只去-1,因为最后一个char在检查之后没有任何东西。 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();
}