Поиск дубликатов в массиве с использованием HashSet и Brute Force - PullRequest
0 голосов
/ 20 февраля 2019

Я просто пытаюсь найти простую программу для поиска дубликатов в данном массиве.

/* Using HashSet */
int[] arrays = {1,2,4,5,4,2};
Set<Integer> hs = new HashSet<Integer>();
for(int ar:arrays)
{
    if(!hs.add(ar))
    {
        System.out.println("Dupicate is:" +ar);             
    }           
}       

/* Nested for loop */
int arraySearch[] = {2,2,3,4,5,6,7,7,7,8,10};
int m = 0; boolean flag = true;
for(int i=0; i<arraySearch.length; i++)
{
    flag=true;
    for(int j=i+1; j<arraySearch.length; j++)
    {
        if(arraySearch[i] == arraySearch[j])
        {
            m=arraySearch[i];
            flag = false;
            break;
        }
    }
    if(flag == false)
    {
        System.out.println(m);
    }   
}

Оба подхода дают правильный результат, но проблема, с которой я сталкиваюсь, заключается в том, что два числа повторяются одно за другимпечатается дважды.скажем int [] массивы = {1,1,2,4,5,4,2};

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Если вы используете Java 8 или более позднюю версию, вы можете сделать это следующим образом:

int[] arrays = {1,1,2,4,5,4,2};
List<Integer> hs = IntStream.of(arrays).boxed().collect(Collectors.toList());           
hs.stream().filter(i -> Collections.frequency(hs, i) > 1)
   .collect(Collectors.toSet()).forEach(System.out::println);
0 голосов
/ 20 февраля 2019

Видите ли вы дополнительный выход, когда есть двойные числа или когда есть тройки?

Например, для этого входа:

int arraySearch[] = {2,2,3,4,5,6,7,7,7,8,10};

Будет два обнаружения по 7. Чтосуществует два обнаружения - результат одного элемента 6 проверки цикла по элементам с 7 по 10 и второго элемента 7 проверки цикла по элементам с 8 по 10:

first detection: {2,2,3,4,5,6,(7),(7),7,8,10};
second detection: {2,2,3,4,5,6,7,(7),(7),8,10};

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

0 голосов
/ 20 февраля 2019

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

Set<Integer> hs=new HashSet<Integer>();
Set<Integer> duplicate= new HashSet<Integer>();
for(int ar:arrays)
{
    if(!hs.add(ar))
    {
        duplicate.add(ar); 
    }           
}

Таким образом можно избежать дублирования печати.После этого элементы в наборе могут отображаться с помощью цикла.

...