Дубликаты в массиве - самая распространенная проблема, с которой мы сталкиваемся, когда имеем дело со структурами данных массива. Известная проблема - найти повторяющиеся элементы в массиве, а иногда и подсчитать количество дубликатов в массиве.

Рекомендуется: прочтите Массивы в Java и Структуры данных, прежде чем продолжить, если это необходимо.

В этой статье мы собираемся решить ту же небольшую измененную задачу. Мы должны обеспечить стабильность массива, а пока мы должны удалить самые ранние дубликаты. Посмотрите на изображение ниже, чтобы понять суть проблемы.

Давайте посмотрим, как ее решить, используя мощный язык Java. Подходов к решению этой проблемы может быть множество. Давайте воспользуемся следующим подходом.

Здесь мы должны создать новый массив, который будет результатом этой проблемы. Перед доступом к этому массиву необходимо знать его размер. Почему? Что ж, мы уже подробно обсуждали это в статье Массивы в Java.

Итак, начальная потребность здесь сейчас состоит в том, чтобы знать размер результирующего массива, то есть; количество элементов без учета дубликатов. Давайте воспользуемся точным массивом, упомянутым на изображении выше, с несколькими дубликатами и размером 8.

Array elements are {a, a, b, c, c, d, a, c}

Размер результирующего массива равен 4. Как это реализовать на Java?

public static int getNumberOfDuplicates(char[] arg) {
     String [] str = new String[arg.length];
     for(int i = 0; i < arg.length; i++){
          str[i] = String.valueOf(arg[i]);
     }
     Set<String> noDup = new LinkedHashSet<String>
     (Arrays.asList(str));
     return (arg.length - noDup.size());
}

Мы передаем исходный массив этому методу, чтобы вычислить количество дубликатов.

Set<String> noDup = new LinkedHashSet<String>(Arrays.asList(str));

Это самый простой способ получить список без дубликатов.

Теперь нам нужно разработать решение нашей основной проблемы. Теперь у нас есть исходный массив и количество дубликатов. Таким образом, мы можем узнать размер результирующего массива. Давайте создадим следующий метод removeDuplicates (char [] arg, int duplicates) для решения проблемы.

char [] newArray = new char [arg.length-duplicates];

Нам нужно создать пустой массив, который будет результирующим массивом нашей программы. Здесь размер равен arg.length-duplicates. Как? Узнай, это основы математики.

int k = arg.length-duplicates-1;
if(duplicates > 0) {
    for(int i = arg.length-1; i >= 0 ; i--) {
          boolean yes = false;
          for( int j = 0; j<newArray.length; j++) {
                  if(arg[i] == newArray[j]){
                        yes = true;
                  }
          }
          if(yes == false) {
                  newArray[k]=arg[i];
                  k = k - 1;
          }
    }
   
    return newArray;
} else {
    return arg;
}

Мы просто проверяем, есть ли у нас дубликаты или нет, и если они есть, мы переходим от последнего элемента исходного массива. А затем мы просто проверяем существование элемента, который мы берем из последнего элемента исходного массива в нашем результирующем массиве. Если он уже есть, мы меняем логическую переменную yes на true. Таким образом, в условном операторе мы просто проверяем эту переменную, и если она ложна, это означает, что элемента нет в результирующем массиве. Вот как мы создаем результирующий массив.

В основном методе мы просто делаем следующие вещи.

char [] array = {'a', 'a', 'b', 'c', 'c', 'd', 'a', 'c'};
int duplicates = getNumberOfDuplicates(array);
char [] resultantArray = new char [duplicates];
resultantArray = removeDuplicates(array, duplicates);
printArray(resultantArray);

И на выходе

[b, d, a, c]

Таким образом, мы можем поддерживать стабильность и удалять самые ранние дубликаты из массива.

Попробуйте реализовать несколько лучших и альтернативных способов решения этой проблемы и поделитесь со мной.

Надеюсь, статья поможет. Поделитесь и своими мыслями.