【问题标题】:how to delete duplicate character from a string如何从字符串中删除重复字符
【发布时间】:2016-10-13 00:17:51
【问题描述】:

问题要求我写一个方法,从原字符串中删除重复字符,返回新字符串。比如原字符串是abracadabra,结果应该是abrcd。

我正在考虑使用 StringBuilder 删除字符,但是当我尝试运行代码时出现了问题。谁能帮我修一下。

public static String eliminateDuplicates(String str){
    String result = "";
    StringBuilder strings = new StringBuilder(str);
    for(int i = 0; i<str.length(); i++){
        for(int j = 1; j<str.length();j++){
            if(str.charAt(i)==str.charAt(j)){
                strings.deleteCharAt(j);
            }
        }
    }
    result = strings.toString();
    return result;
}

【问题讨论】:

  • 在迭代时改变某些东西总是会导致灾难......
  • 与其删除,不如考虑构建原始字符串的副本,逐个添加字符,除了跳过已经存在的字符。 StringBuilder 没有提供很好的查找字符的方法,因此请考虑使用 Set&lt;Character&gt; 跟踪其中的内容。

标签: java string stringbuilder


【解决方案1】:

试试这个。

public static String eliminateDuplicates(String str){
    int[] uniq = str.codePoints().distinct().toArray();
    return new String(uniq, 0, uniq.length);
}

【讨论】:

  • 这是 java 8 吗?
  • @ScaryWombat 是的。
  • 成功了。但我不明白你的代码。你能解释一下吗?谢谢
  • @HongxuLin str.codePoints() 创建str 的字符流。 distinct() 删除它们的重复项。 toArray() 使它们成为一个 int 数组。最后new String() 将其重构为字符串。
【解决方案2】:

使用@P.J 的想法

public static String eliminateDuplicates(String str) {
    HashSet<Character> hashSet = new HashSet();
    //A hashSet is a collection that only adds unique elements.

    char[] toCharArray = str.toCharArray();
    for (char c : toCharArray) {
        hashSet.add(c);
    }

    StringBuilder answer = new StringBuilder();
    for (Character character : hashSet) {
        answer.append(character);
    }

    return answer.toString();
}

【讨论】:

  • 我会将answer 更改为StringBuilder 而不是String
  • @ScaryWombat 完成
【解决方案3】:

试试这个代码,也许你可以优化:

public static String eliminateDuplicates(String source) {
    StringBuilder result = new StringBuilder();
    for (int i = 0, sLength = source.length(); i < sLength; i++) {
        char readyToAdd = source.charAt(i);
        boolean add = true;

        for (int j = 0; j < result.length(); j++) {
            if (readyToAdd == result.charAt(j)) {
                add = false;
                break;
            }
        }

        if (add) result.append(readyToAdd);
    }

    return result.toString();
}

【讨论】:

    【解决方案4】:

    有问题的代码正在迭代输入字符串,但使用索引从字符串构建器对象中删除字符。

    每次字符串生成器删除字符时,它都会减小大小。因此,您的代码将因 IndexOutofBoundsException 而失败。如果是这种情况,请在问题中添加异常的整个堆栈跟踪以确认。

    删除重复项的更好方法是通过迭代输入字符串然后仅将唯一字符复制到新字符串来创建另一个字符串。然后可以将新字符串作为结果返回。

    与时间复杂度为O(n*n)的当前代码相比,这也将具有更好的时间复杂度O(n*m)

    【讨论】:

    • 如果使用 Java 集合、哈希集,那么是的,你是对的,它将是 O(n)。我指的是当前角色与每个独特角色的愚蠢比较,而不使用集合。显然前一种方法更好,但对于新手来说,后者更容易理解和实施。
    【解决方案5】:

    试试这个

    public static String eliminateDuplicates(String str){
        StringBuilder result = new StringBuilder();
        BitSet bs=new BitSet(256);
        char[] chars=str.toCharArray();
        char getChar=0;
        for(int i=0;i<chars.length;i++){
            getChar=chars[i];
            if(!bs.get(getChar)){
                result.append(getChar);
                bs.set(getChar);
            }
        }
        return result.toString();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      相关资源
      最近更新 更多