【问题标题】:Java Method for removing duplicates from char array用于从 char 数组中删除重复项的 Java 方法
【发布时间】:2015-08-08 12:53:06
【问题描述】:

我有一个由用户 (arrayInput[]) 填充的字符数组,其中包含一些字符,例如 {b, d, a, b, f, a, g, a, a, f},我需要创建一个该方法返回一个新的 char 数组,该数组仅包含第一次出现的字符,但按输入顺序排列。这本书还说“解决这个问题的一种方法是创建一个布尔数组来跟踪要保存的字符!”,但我无法想象布尔数组应该如何与其他数组一起使用。

主要问题是如果arrayInput 包含特定字符,我可以保存在布尔数组中,甚至可以保存多少次,但只能将一个很长的分支 if-else 创建为 for,例如

    if ((arrayOutput[i] == 'A') && (arrayControl[0] = false)) {
        arrayControl[0] = true;  }

arrayOutput 是我想从方法返回的数组,arrayControl[0] 是我在方法中创建的布尔数组中的“A”值。 A = 0, B = 1, ... Z = 25, a = 26, b = 27, ... 51 = z。对于每一个字符,大写和小写,我在数组中创建了一个位置,所以我可以检查所有内容,但现在我不能再进一步了。我不知道如何在arrayOutput 上保存字符,如何检查一个字符是否已经在arrayOutput 上,如果它已经存在,则数组传递该特定字符并转到下一个。

另外请记住我是新手,所以我对 Java 知之甚少。请尽你所能解释你自己。提前致谢!

【问题讨论】:

  • 使用布尔数组的提示:不要检查false。而是检查 true 并从数组中删除如果值已经是 true 当您访问它。
  • 没错!我会把小费保存在书上,谢谢!

标签: java arrays char duplicates


【解决方案1】:

这可以工作:

public static void main(String[] args) {
    Main main = new Main();
    char[] array = {'e','a','b','a','c','d','b','d','c','e'};
    main.getCharArray(array);
}

private char[] getCharArray(char[] array) {
    String _array = "";
    for(int i = 0; i < array.length; i++) {
        if(_array.indexOf(array[i]) == -1) // check if a char already exist, if not exist then return -1
            _array = _array+array[i];      // add new char
    }
    return _array.toCharArray();
}

输出:

eabcd

【讨论】:

  • 您,先生,太棒了。这正是我所需要的。非常感谢! :D
  • 做这项工作,但在O(n^2) 其他解决方案提供O(n)
【解决方案2】:
 boolean arr[26]; //considering only small letters arrive. otherwise take a larger array.
for( i=0;i<str.length;i++ )
  arr[str[i]-'a']=true;

循环后最后为真的才是真正的角色。 (删除所有重复项)。

要考虑位置,

int arr[26];
  //initialize all the array elemnts to 0
  for( i=0;i<str.length();i++ )
      if(i>=arr[str[i]-'a'])
            arr[str[i]-'a']=i+1;

//大于0的为非重复字符。他们第一次出现的位置= (arr[i]-1)

编辑:我上次使用 java 大约是一年前。算法显示正确。对不起,我笨拙的 java 代码。

【讨论】:

  • 这里不考虑输入顺序。
  • @AnindyaDutta 好的,那么我们可以代替整数数组,并将位置放在那里。
  • @AnindyaDutta.:现在检查我的答案。希望对你有帮助
【解决方案3】:

这可能会有所帮助。制作一个单独的数组,只存储不重复的字符。

char[] removeDuplicates (char[] arrayInput) {
    boolean exists[]=new boolean[26];
    char arrayOutput[] = new char[26];
    int ctr=0;
    for(int i=0; i<26; i++) {
        exists[i] = false;
    }
    for(int i=0; i<arrayInput.length; i++) {
        if(!exists[arrayInput[i]-97]) {
            exists[arrayInput[i]-97]=true;
            arrayOutput[ctr++]=arrayInput[i];
        }
    }

   return Arrays.copyOfRange(arrayOutput, 0, ctr);

}

【讨论】:

  • 在第二个for中,最初所有的值都是false。然后每当遇到新字符时,我都会将位置更新为true。 'a' 代表exists[0]...z 代表exists[25]。那么下一次,因为是true,所以会跳过重复的字符。
  • 哦。好的。我什至猜不出来,真的。也许我遗漏了一些东西,但是......为什么 -97,为什么 !exists?
  • -97 因为我想将a 放在0 的位置。 a 的 Unicode 值是 97。所以要将字符 97 放在位置 0,我减去 97。!exists 因为如果字符已经存在于数组中,那么我们肯定会遇到重复点,我们必须考虑它,因此跳过该字符的循环。
  • 哦!现在我懂了!如果我不想使用 "(!exists[arrayInput[i]-97])" 而是另一个条件来表达同样的事情怎么办。我能怎么做?我需要问这个,因为我应该只使用这本书给我的东西,这对我来说是一个高级水平。
【解决方案4】:

如果您考虑使用集合框架,那么它会容易得多。您的 char 重复数组是 arrayInput。现在把每个 char 从它放到一个 HashSet 像这样 -

HashSet<Character> uniqueCharSet = new HashSet<Character>();
for(char each : arrayInput){

   uniqueCharSet.add(each);
}   

现在HashSet uniqueCharSet 将只包含来自char 数组arrayInput 的唯一字符。请注意,uniqueCharSet 中的所有元素都是包装类型 - Character

您可以像这样将HashSet uniqueCharSet 转换为Character 的数组 -

Object[] uniqueCharArray = uniqueCharSet.toArray();

然后你可以像这样使用它们 -

for(Object each : uniqueCharArray){
   Character c = (Character) each;
   System.out.println(c);
}

【讨论】:

  • 感谢您的回答,但遗憾的是我无法使用它。我只被允许使用 if-else、while、do-while、数组、方法和 Java 的真正基础知识。我在大学一年级,这是关于数组一章的练习。
【解决方案5】:

这是实现您需要的方法:

public static void main(String[] args) {
    char[] arr= {'A','B','C','A','B'};

    HashSet<Character> hset=new HashSet<Character>();

    for(int i=0;i<arr.length;i++) {
        hset.add(arr[i]);
        }

    Object[] ObjChar=hset.toArray();

    char[] resultArr = new char[ObjChar.length];

    for(int j=0;j<ObjChar.length;j++) {

    resultArr[j]=(char) ObjChar[j];
    }

    for(char eachChar: resultArr) {

        System.out.println(eachChar);
    }
}

【讨论】:

  • 您好,欢迎来到 Stackoverflow!当你回答一个问题时,你必须解释你的代码是做什么的。感谢您的贡献。
猜你喜欢
  • 2012-04-20
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
  • 2014-04-23
  • 2015-11-07
  • 1970-01-01
  • 2019-05-02
  • 2011-04-09
相关资源
最近更新 更多