Удаление повторяющихся символов в массиве String

У меня есть пример ввода, например, [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() для строк.

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 a d f Выход: a d f

4 ответа

Решение

Ваша проблема в том, что вы проверяете каждый символ против всех символов после него. Представьте себе массив без дубликатов; как только вы доберетесь до последнего символа, вы распечатаете все символы перед ним. Но когда 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] + " ");

Если вы хотите удалить значения, а не просто пропустить их при печати, вы захотите начать с конца массива и перейти к 0, вызывая array.remove(i), когда вы найдете объект, который соответствует ранее проверенному объект.

Хотя это просто для того, чтобы сделать это как упражнение цикла. Было бы проще поместить ваш массив в набор.

Вы можете использовать логический массив размером 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();
}

Полный код на

Удаление повторяющихся символов из строки без использования Set | Блог Джайна Таруна

Почему бы не использовать только один цикл?

//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] + " ");
}
Другие вопросы по тегам