用于从char数组中删除重复项的Java方法

时间:2015-05-26 17:50:25

标签: java arrays char duplicates

我有一个由用户(arrayInput[])填充的char数组,其中包含一些字符,如{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知之甚少。请尽你所能解释自己。提前致谢!

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

 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代码。

答案 2 :(得分:0)

这可能会有所帮助。创建一个单独的数组并仅存储非重复的字符。

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

}

答案 3 :(得分:0)

如果您考虑使用收集框架,那么它会更容易。您的char数组arrayInputchar。现在将每个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);
}

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

@Entity
@Table(name = "PROFOLDERSYS_JOIN")

public class ProjectFileSystem implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int foldersysid;

private int proclassid;

private int projectid;

private String projectName;

private String folderName;

public ProjectFileSystem() {

}

public ProjectFileSystem(int proclassid, int projectid,
        String projectName, String folderName) {
    this.proclassid = proclassid;
    this.projectid = projectid;
    this.projectName = projectName;
    this.folderName = folderName;
}


// getters and setters
}

答案 4 :(得分:0)

这是实现您所需的方法:

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