2013-09-26 2 views
0

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

Я хочу, чтобы выход моей программы, как это:
1 произошло: 2times
2 произошло: 1times
3 произошло: 1times
6 произошло: 1times

но моя программа дает оценку выходной сигнал этого:
1 произошло: 1times
1 произошло: 2times
2 произошло: 1times
3 произошло: 1times
6 произошло: 1times

String[] values= {"1", "1", "3", "6", "2"}; 
int[] counts = new int[values.length]; 
Arrays.sort(values); 
int temp = 0; 
int c = 0; 
for(int i = 0; i < values.length; i++){ 
    counts[i] = Integer.parseInt(values[i]); 
    for(int j = 0;j < counts.length; j++) { 
    if(counts[i] == counts[j]) { 
     c++; 
    } 
    } 
    System.out.println(counts[i] + " occured: " + c +" times"); 
    c = 0; 
} 
+5

Вы можете сделать это, используя hashmap. – vikiiii

+0

Посмотрите на http://stackoverflow.com/questions/8098601/java-count-occurrence-of-each-item-in-an-array :) – sufinawaz

+3

Пожалуйста, избегайте statemts без фигурных скобок. –

ответ

1

Посмотрите, подобно вашему подходу, но используя только один массив (и без хэш-карт). Я тестировал, и он работает.

 String[] values= {"1","1","3","6","2"};  
    Arrays.sort(values); 
    int c=1,i=0; 
    while(i<values.length-1){ 
     while(values[i].equals(values[i+1])){ 
      c++; 
      i++; 
     } 
     System.out.println(values[i] + " appeared " + c + " times");    
     c=1; 
     i++; 
     if(i==values.length-1) 
      System.out.println(values[i] + " appeared " + c + " times"); 
    } 
+1

Это очень ужасно: причина 'values ​​[i] == values ​​[i + 1]' even works заключается в том, что компилятор ставит строковые литералы. Попробуйте прочитать «значения» от входа пользователя, чтобы увидеть этот разрыв на куски. Логика принудительной печати последнего элемента внутри цикла настолько запутана, что у меня больно мозгом. Я понимаю, что вы выбрали подход OP в качестве отправной точки, поэтому я бы не сделал этого, но я думаю, что такое исправление может обучить OP абсолютно неправильной точке. – dasblinkenlight

1

Вот проблема: вы хотите иметь место только четыре заявления для печати, но вы получаете пять. Поскольку в этом коде отсутствуют фигурные скобки и имеет плохие отступы, вы можете увидеть или не увидеть, что функция println принадлежит i-му циклу. Сколько раз цикл i запускается? Подсказка: это i.length, которая в этом случае равна _ _ (вы заполняете пробел).

Как только вы увидите, почему есть дополнительный println, попробуйте исправить свой код, а затем вернитесь с конкретными вопросами, если вам нужна помощь.

1

Ваш код слишком быстро при печати своего решения: вместо того, чтобы один println за единицу из values, вам нужно вызвать его один раз в отчетливого найденного элемента в массиве values.

Одним из способов сделать это было бы с помощью Map<String,Integer> для подсчета предметов. Вы можете сделать это следующим образом:

Map<String,Integer> counts = new HashMap<String,Integer>(); 
for (String s : values) { 
    if (counts.containsKey(s)) { 
     int old = counts.get(s); 
     counts.put(s, old+1); 
    } else { 
     counts.put(s, 1); 
    } 
} 
for (Map.Entry<String,Integer> entry : counts.entrySet()) { 
    System.out.println(entry.getKey() + " - " + entry.getValue()); 
} 

Demo on ideone.

1

апача CollectionUtils имеет встроенный метод полезности, подобный подход dasblinkenlight в:

Map<String, Integer> counts = 
    CollectionsUtils.getCardinalityMap(Arrays.asList(values)); 
for (Map.MapEntry<String,Integer> entry : counts) { 
    System.out.println(entry.getKey() + " - " + entry.getValue()); 
} 

EDIT:
Обновление старых ответов. В потоках Java 8 есть встроенный эквивалент для этого:

Map<Stirng, Long> = 
    Arrays.stream(values) 
      .collect(Collectors.groupingBy(Function.identity(), 
        Collectors.counting())); 
Смежные вопросы