Дубликаты в массиве - самая распространенная проблема, с которой мы сталкиваемся, когда имеем дело со структурами данных массива. Известная проблема - найти повторяющиеся элементы в массиве, а иногда и подсчитать количество дубликатов в массиве.
Рекомендуется: прочтите Массивы в 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]
Таким образом, мы можем поддерживать стабильность и удалять самые ранние дубликаты из массива.
Попробуйте реализовать несколько лучших и альтернативных способов решения этой проблемы и поделитесь со мной.
Надеюсь, статья поможет. Поделитесь и своими мыслями.