2016-12-28 2 views
0

Это домашнее заданиеКоличество уникальных элементов из массива

Я просто хочу, намеки на то, что ошибка. Я пытаюсь сравнить каждый элемент массива друг с другом и вернуть количество уникальных элементов. Я получаю сообщение об ошибке? Может ли кто-нибудь помочь мне найти ошибку?

public static int numUnique (double[] list) { 
    int index = 1; 
    int result = 0; 
    if(list.length == 0){return 0;} 

    while(index < list.length) { 
     if(list[index] != list[index - 1]) { 
      result = result + 1; 
     } 
     index++; 
    } 
    return result; 
} 

Выход:

Failed numUnique([11]): Expecting (1) Actual (0) 

Failed numUnique([11 11 11 11]): Expecting (1) Actual (0) 

Failed numUnique([11 21 31 41]): Expecting (4) Actual (3) 

Failed numUnique([11 11 11 21 31 31 31 31 41]): Expecting (4) Actual (3) 

Failed numUnique([11 21 21 21 31 41 41 41 41]): Expecting (4) Actual (3) 

Failed numUnique([11 11 21 21 21 31 31 41 41 41 41]): Expecting (4) Actual (3) 
+0

Почему бы просто не инициализировать 'result' с 1 вместо if, если 0? – luk2302

+0

О, это сработало! Но почему? –

+1

Поскольку вы в основном считаете переход между разными значениями, количество переходов всегда меньше, чем количество разных значений. – luk2302

ответ

1

Задав начальное значение index 1 ваш цикл пропускается 0 элемент, так как вы можете гарантировать, что она уникальна (потому что вы не смотрели на любых элементах). Так как это так, вы должны инициализировать result до 1.

+0

Спасибо за ваш ответ! Теперь это имеет смысл, спасибо. –

1

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

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

Вы хотите сравнить каждый элемент со всеми другими элементами перед тем и подсчитать, сколько раз они уникальны:

int uniques = 0; 
for(int i = 0 ; i < list.length ; i++) { 
    boolean found = false; 
    for(int j = 0 ; j < i ; j++) { 
     if(list[i] == list[j]) { 
      found = true; 
      break; 
     } 
    } 
    uniques += found ? 0 : 1; 
} 
+1

Лучшим решением было бы отсортировать массив вверх, чтобы у вас был O (n) вместо O (n^2). – rodrigoap

+1

Это будет O (n log n), подсчитывающий сортировку. Но я стараюсь уважать стратегию OP: «Я пытаюсь сравнить каждый элемент массива друг с другом и вернуть количество уникальных элементов». –

0

попробовать это:

КОД:

public class uniqueElements { 
    public static void main(String args[]){ 
     double[] list = new double[8]; 
     list[0] = 1.1; 
     list[1] = 2.4; 
     list[2] = 3.5; 
     list[3] = 1.1; 
     list[4] = 2.4; 
     list[5] = 2.4; 
     list[6] = 3.3; 
     list[7] = 3.5; 
     System.out.println(numUnique(list)); 
    } 

    public static int numUnique (double[] list) { 
     int numUniqueCounter = 0; 
     A: 
      for(int i=0;i<list.length;i++){ 
       double currentNumber = list[i];   
       for(int j=i+1;j<list.length;j++){ 
        if(list[j] == currentNumber){        
         continue A;      
        } 
       }    
       numUniqueCounter++; 
      } 
     return numUniqueCounter; 
    } 
} 

ВЫХОД:

4 
0

Используйте это вместо того, эффективный и один проход можно определить уникальные элементы

public static int numUnique(double[] list) { 
     Set<Double> uniqueSet = new HashSet<>(); 
     for (int i = 0; i < list.length; i++) { 
      uniqueSet.add(list[i]); 
     } 
     return uniqueSet.size(); 
    } 
0

Я не могу устоять:

public static int numUnique (Double[] list) { 
    return new HashSet<>(Arrays.asList(list)).size(); 
    } 

Не переход от двойного [] для Double [] ,

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

+0

Ну ... Я не могу использовать какие-либо коллекции! Это единственный метод домашнего задания. Спасибо, что поделился! –

+0

ouch. Затем вы обречены делать двойную петлю.Код в вашем вопросе сравнивается только с предыдущим элементом. Вам нужно проверить каждый элемент. –

Смежные вопросы