删除字符串数组中的重复字符

Removing duplicate characters in a String array

我有一个像 [q w e r r t] 这样的示例输入,我想删除重复项并使用数组打印 [q w e r t]。我不明白为什么下面的代码片段的输出不同。

for(int j=0; j< array.length; j++) {
    for(int k=j+1; k< array.length; k++) {
        if(array[j] == array[k]) {
            continue;
        }
        System.out.print(array[j] + " ");
        j = k;
    }
}

更新:我想将此逻辑用于排序数组。我使用了 Arrays.sort()。我将 == 更改为 .equals() for Strings.

public static void main(String args[]) throws IOException {

    // Enter size of array and assert the type of input
    System.out.println("Enter size of array in integers");
    Scanner sc = new Scanner(System.in);
    while (!sc.hasNextInt()) {
        System.out.println("Please enter integers");
        sc.next();
    }
    ;

    // Accepting the values into the array and sorting them
    int demoInt = sc.nextInt();
    String[] array = new String[demoInt];
    String[] outputMarkers = new String[demoInt];
    System.out.println("Enter the values");
    for (int i = 0; i < array.length; i++) {
        Scanner scNum = new Scanner(System.in);
        array[i] = scNum.next();
        if (i == array.length - 1) System.out.println("Array is full");
    }
    Arrays.sort(array);
    System.out.printf("Sorted array is : %s", Arrays.toString(array));

    //Checking for duplicates //Sample: a a a s d f
    for (int j = 0; j < array.length; j++) {
        for (int k = j + 1; k < array.length; k++) {
            if (array[j].equals(array[k])) {
                continue; //returns to for loop with increment
            }
            System.out.print(array[j] + ". ");
            j = k;
        }
    }
}

输入:a a d f 输出:a d f

为什么不只使用一个循环?

//assuming array has length >= 2
System.out.print(array[0] + " ");
for(int j=1; j< array.length; j++) {
    if(array[j] == array[j - 1]) {
        continue;
    }
    System.out.print(array[j] + " ");
}

如果您希望删除值而不是在打印时跳过它们,您将希望从数组的末尾开始并向 0 移动,当您找到时调用 array.remove(i)与先前检查的对象匹配的对象。

虽然那只是作为循环练习来做。将数组推入集合会更容易。

你的问题是你正在检查每个字符和它后面的所有字符。想象一个没有重复的数组;一旦你到达最后一个字符,你就打印出了它之前的所有字符。但是当 j = array.length - 1,然后 k = array.length,第二个 for 循环根本不会 运行,你的最后一个字符将永远不会被打印出来。

您的代码总是无法正确打印最后一个元素。唯一正确的情况是你的最后一个元素是前一个元素的副本,而不是倒数第二个元素的副本。

试试这个代码:

outerloop:
for (int j = 0; j < array.length; j++) {
    for(int k = 0; k < j; k++) {
        if(array[j] == array[k]) {
                continue outerloop;
        }
    }
    System.out.print(array[j] + " ");
}

代码的前提是循环遍历每个字符。如果它与前面的任何字符匹配,代码将跳过该元素并继续到下一个。

编辑:您似乎编辑了排序数组的问题。这意味着如果最后一个元素是重复的,它将是它之前元素的重复,因此我们不必担心我之前代码块中的极端情况。

for(int j=0; j< array.length; j++) {
    for(int k=j+1; k< array.length; k++) {
        if(array[j] == array[k]) {
            continue;
        }
        System.out.print(array[j] + " ");
        j = k;
    }
}
System.out.print(array[array.length-1] + " ");

可以使用大小为122的布尔数组,使数组中的所有值都为假,迭代给定的字符数组,如果字符的ASCII值为假,则使之为真并打印。 下面是示例代码,这里我取了一个字符串并删除了所有重复项并打印了结果字符串:

static String removeDuplicate(String s) {
    boolean[] flagArr = new boolean[122];
    int sLength = s.length();
    StringBuilder resultStr = new StringBuilder();
    for (int i = 0; i < sLength; i++) {
        char tempChar = s.charAt(i);
        int tempVal = (int) tempChar;
        if (!flagArr[tempVal]) {
            flagArr[tempVal] = true;
            resultStr.append(tempChar);
        }
    }
    return resultStr.toString();
}

完整代码在

Removing Duplicate Characters From String Without Using Set | jain Tarun Blog