Удаление дубликатов в массиве String[] с использованием Arrays.copyOf

454
10 августа 2017, 22:06

Привет всем, есть метод public String[] remove(String[] array), который должен удалить все дубликаты в массиве. Для обрезания массива надо использовать метод Arrays.copyOf, то есть метод должен заканчиваться на return Arrays.copyOf(исходный массив, кол-во не дублированных значений). Заранее прошу вас описать сам алгоритм в виде комментариев с боку.

Дополнительные условия:

  1. В задаче нельзя использовать дополнительные массивы
  2. Метод Arrays.copyOf не изменяет исходный массив, он копирует n элементов исходного массива с начала в новый массив.
  3. Перед обрезкой массива необходимо сгруппировать дубликаты в конце массива с помощью перестановок.
  4. Метод должен заканчиваться строкой return Arrays.copyOf(исходный массив, кол-во не дублированных значений).
Answer 1

Как-то так кажется. Суть алгоритма в том, что мы меняем местами найденный дубликат с элементом в конце массива (со сдвигом к началу на количество найденных дубликатов), при этом храним счетчик перемещенных дубликатов. while нам помогает в ситуации если мы хотим свапнуть два одинаковых элемента, первое его условие защищает от выхода за границы массива.

@Test
public void tt(){
    String[] strings = new String[]{"6","6","7","7","4","8","4","5","6","8", "8", "4", "7","6"};
    System.out.println(Arrays.toString(remove(strings)));
}
private String[] remove(String[] strings){
    int dup = 0;
    for(int i = 0; i < strings.length; i++){
        for(int j = i + 1; j < strings.length - dup; j++){
            if(strings[i].equals(strings[j])){
                while(j != strings.length - dup - 1 
                        && strings[strings.length - dup - 1].equals(strings[j])){
                    dup++;
                }
                String tmp = strings[strings.length - dup - 1];
                strings[strings.length - dup - 1] = strings[j];
                strings[j] = tmp;
                dup++;
            }
        }
    }
    return Arrays.copyOf(strings, strings.length - dup);
}

Исходный массив:

[6, 6, 7, 7, 4, 8, 4, 5, 6, 8, 8, 4, 7, 6]

Массив после перемещения дубликатов в конец:

[6, 7, 8, 4, 5, 4, 4, 8, 8, 7, 7, 6, 6, 6]

Результат:

[6, 7, 8, 4, 5]

READ ALSO
Обращение из сервиса к сервиса(RESTful,Spring boot)

Обращение из сервиса к сервиса(RESTful,Spring boot)

RESTful сервису 1 необходимо получить данные с RESTful сервису 2Данные можно получить по урлу: /products

365
Почему в java конструкторы не наследуются? [требует правки]

Почему в java конструкторы не наследуются? [требует правки]

Можно получить ответ простым человеческим языком?

354
Ошибка "BaseActivity cannot be cast to Interface

Ошибка "BaseActivity cannot be cast to Interface

Дело в том что, до этого времени, я интерфейсы реализовывал в Activity, значения методов задавал во FragmentТо есть, в onAttach() инициализировал, а потом...

350