比较两个数组并从原始数组java中删除重复数据(无列表)

时间:2016-11-26 21:13:16

标签: java arrays

所以我试图比较两个char数组,并且应该从数组invAlphabet中删除keyW中存在的所有字母。我已经能够在invAlphabet数组中找到重复项,但是,我不知道如何删除重复的元素而不使用我不应该使用的列表或集合... 有什么想法吗?

public static void main(String[] args)
{
    final int SIZE = 26;
    char[] keyW = {'A', 'L','O'};

    char[] invAlphabet = new char [SIZE];


    for (int i = 0; i < SIZE; i++)
    {
        invAlphabet[i] = (char)('Z' - i);

    }



    for (int i = 0; i<keyW.length; i++)
    {
        for (int j = 0; j < invAlphabet.length; j++)
        {
            if(keyW[i] == invAlphabet[j])
            {
                //need to delete the invAlphabet[j] elements that are duplicates
                System.out.println(invAlphabet[j]);
                System.out.println(j);
                break;

            }

        }
    }

}

4 个答案:

答案 0 :(得分:1)

如果你想在O(n)中解决它,那么你可以标记keyW[]数组中存在的所有字符,然后检查并不要将它们添加到新的noDuplicateArray[]

char[] keyW = {'A', 'L', 'O', 'P'};
char[] invAlphabet = {'X', 'A', 'P', 'B', 'C'};

//create boolean array
boolean[] mark = new boolean[128];
Arrays.fill(mark, false);

//mark which characters are present in keyW array
for (char ch : keyW) {
    mark[ch] = true;
}

// find number of duplicate character in invAlphabet array
int duplicateCount = 0;
for (char ch : invAlphabet) {
    if (mark[ch]) {
        duplicateCount++;
    }
}

// create new array
// size of new array = invAlphabet array length - duplicate number of character in invAlphabet array
char[] noDuplicateArray = new char[invAlphabet.length - duplicateCount];

//add character in new array
int idx = 0;
for (char ch : invAlphabet) {
    if (!mark[ch]) {
        noDuplicateArray[idx++] = ch;
    }
}

答案 1 :(得分:0)

我首先编写一种方法来搜索char[]给定的char(即contains方法),例如

private static boolean contains(char[] chars, char ch) {
    for (char c : chars) {
        if (c == ch) {
            return true;
        }
    }
    return false;
}

然后问题可以分解分为两步。首先,计算重复项,然后通过复制构建输出数组,不带重复项。像

这样的东西
int dupes = 0;
for (char ch : invAlphabet) {
    if (contains(keyW, ch)) {
        dupes++;
    }
}
int i = 0;
char[] noDupes = new char[invAlphabet.length - dupes];
for (char ch : invAlphabet) {
    if (!contains(keyW, ch)) {
        noDupes[i] = ch;
        i++;
    }
} 

或者,您可以将keyW数组转换为String。而且,在Java 8+中,您可以构造一个Stream个角色。映射到数组,过滤String,然后收集到另一个String。像,

String keyWord = new String(keyW);
char[] noDupes = IntStream.range(0, invAlphabet.length)
        .mapToObj(x -> invAlphabet[x])
        .filter(ch -> (keyWord.indexOf(ch) < 0))
        .map(String::valueOf)
        .collect(Collectors.joining()).toCharArray();

答案 2 :(得分:0)

您无法调整数组对象的大小,因为您可以使用其他一些数据类型。但是,如果允许只使用数组,则可以使用其他非字母字符代替删除的字符。例如'0'。因此,在使用或打印时,如果它是“0”,则可以跳过数组中的字符。

答案 3 :(得分:0)

您可以使用Stringreplace方法吗?

String invAlphabetString = new String(invAlphabet);
for(char i:keyW){
    invAlphabetString=invAlphabetString.replace(""+i, "");
}
char[] invAlphabetWithoutKeyW = invAlphabetString.toCharArray();
System.out.println(Arrays.toString(invAlphabetWithoutKeyW));