2013-03-06 3 views
-3

Проблема с этим кодом заключается в том, что он распечатает 5 9 9 вместо 5,9. Потому что в массиве есть третье. Что мне не хватает?Поиск дубликатов чисел в массиве

Редактировать: Мне нужно написать функцию, которая будет получать дубликаты из заданного массива. Я пытаюсь это сделать, но он печатает 5,9,9 вместо 5,9.

Редактировать 2: Ну, я понял это после чтения на HashSet и получил его для работы, используя приведенный ниже код. Надеюсь, это поможет другим людям с той же проблемой.

import java.util.HashSet; 


public class Duplicator { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 

    int[] a = {3,5,5,8,9,9,9}; 

    HashSet<Integer> hash = new HashSet<Integer>(); 

    for(int i = 0; i < a.length; i++){ 

     for(int j = i+1; j< a.length; j++){ 

      if(a[i] == a[j]){ 

       hash.add(a[i]); 

      } 
     } 


    } 

    System.out.println(hash); 

    } 
} 
+0

Какой вопрос здесь Адам? – kuriouscoder

+0

Многие из дубликатов этого в правой части экрана должны быть в состоянии помочь. –

+0

Есть лучшие методы для этого. Этот код выглядит так, как будто O (n^2) хуже. Это не хорошо. Вы можете сделать это в O (n) раз, если вы просто продолжаете свертывание набора и проверяете его по мере продвижения по массиву. Также, если он всегда будет сортироваться, вы можете сделать это без дополнительных структур данных и по-прежнему сохранять O (n), просто отслеживать предыдущий индекс. – Franklin

ответ

0

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

Если значение изменено, установите для boolean duplicateFound значение false.

Если значение не изменилось, а duplicateFound является ложным, установите duplicateFound в true и print.

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

-1

Непонятный вопрос. Если вам нужно устранить дубликаты, простой способ в зависимости от размера входного массива состоял бы в том, чтобы построить java.util.Set и перебрать его.

+0

Это явно проблема домашних заданий, в противном случае ваш ответ был бы уместным – Patashu

+2

Если вы не совсем поняли вопрос то это не ответ ... –

0

Вы можете использовать набор, чтобы избежать дублирования значений. Например:

Set<Integer> values=new HashSet<Integer>(); 
values.add(5); 
values.add(9); 
values.add(9); 
for(Integer val: values) { 
System.out.println(val); 
} 

печатает:

5 
9 

Другой пример:

int[] a = {3,5,5,8,9,9,9}; 
List<Integer> list=new ArrayList<Integer>(); 
for(int i=0; i<a.length; i++) { 
if(!list.contains(a[i])) { 
list.add(a[i]); 
} 

} 

for(int index=0; index<list.size(); index++) { 
System.out.println(list.get(index));// prints the value in the corresponding index. 
} 

Он печатает следующим образом:

3 
5 
8 
9 
2

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

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

Вы также можете использовать наборы:

public static void main(String[] args) { 
    int[] a = {3,5,5,8,9,9,9}; 

    Set<Integer> encounteredNumbers = new HashSet<Integer>(); 
    Set<Integer> duplicateNumbers = new LinkedHashSet<Integer>(); // LinkedHashSet to keep in same order as encountered. 
    for (int i : a) { 
    if (encounteredNumbers.contains(i)) { 
     duplicateNumbers.add(i); 
    } 
    encounteredNumbers.add(i); 
    } 

    System.out.println(duplicateNumbers); 
} 
Смежные вопросы