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

在java中,从字符串中删除重复字符的最有效方法是什么?,java,performance,Java,Performance,我有一个helper函数,用于查找字符串中重复字符的索引。 现在,删除这些重复项的最佳方法是什么? 谢谢 这是我知道的最好的方法。它获取一个字符串,将其分隔为字符,将其放入哈希集中(非重复、有序),然后打印(或返回该字符串) 这是列出的方法中最好的一种 String example = "thiscode"; char[] chars = example.toCharArray(); Set<Character> str = new LinkedHashSet<Characte

我有一个helper函数,用于查找字符串中重复字符的索引。 现在,删除这些重复项的最佳方法是什么?
谢谢

这是我知道的最好的方法。它获取一个字符串,将其分隔为字符,将其放入哈希集中(非重复、有序),然后打印(或返回该字符串)

这是列出的方法中最好的一种

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

希望这有帮助。

另一种可能的解决方案:

  • 将字符串转换为字符

    char[]charz=inputString.toCharArray()

  • 对字符进行排序

    数组。排序(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());