2017-02-12 4 views
3

Я новичок в java, и благодаря своим поисковым запросам найдено много сообщений о том, что я ищу, но не совсем. Я пытаюсь использовать элементарные методы java, чтобы подсчитать количество UNIQUE раз, когда число соответствует. Например, массив {2,3,2,3,2} имел бы два уникальных совпадающих пары (2,2) и (3,3) Пока (см. Ниже код) все, что я могу представить является подсчет количества TOTAL mached пар. в примере случая результатом будет четыре случая (2,2), (2,2), (3,3), (2,2). Чтобы быть ясным, это первый тип проблемы типа семестра, поэтому я не может использовать карту или более совершенные методы. Простые циклы с подсчетами и итерациями. БлагодаряПодсчет неповторяющихся совпадающих пар в массиве Java

int count = 0; 
    for(int i=0;i<=hand.length-2 ;i++) 
    { 
     for(int j=i+1;j<=hand.length-1;j++) 
     { 
      if (hand[j] == hand[i]) 
      { 

       count = count + 1; 
      } 
     } 
    } 
    System.out.println(count); 
+0

Существуют ли разумные ограничения на цифры? Например, они целые числа от 1 до 100 или что-то еще? –

+0

Я не думаю, что вам действительно нужно построить все пары, чтобы решить вашу проблему, если это только счет, который вам нужен. Если вы преобразуете свой массив в 'Map ', который отображает запись в число вхождений, тогда 'floor (count/2)' должно указывать количество пар для каждого номера no? – Nic

+0

для более контекста, в этой конкретной ситуации я ограничен массивом из пяти значений в диапазоне от 1 до 9. Также пытаюсь решить с помощью элементарных методов, таких как циклы, поскольку я еще не перешел в более сложные темы. – tmoesabi

ответ

1

@azurefrog дает хороший ответ уже. Вот реализация, которая подсчитывает пары, которые имеют более чем 3 записи для заданного числа:

List<Integer> numbers = Arrays.asList(2, 3, 2, 3, 2, 2, 9); 
Map<Integer, Long> map = numbers.stream() 
     .collect(Collectors.groupingBy(num -> num, Collectors.counting())) 
     .entrySet() 
     .stream() 
     .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue()/2)); 

// output 
map.forEach((num, count) -> System.out.println(String.format("%d has %d unique pairs", num, count))); 
Long total = map.values().stream().reduce((acc, c) -> c + acc).get(); 
System.out.print(String.format("A total of %d pairs", total)); 

Принимая во внимание ваших других ограничений, перечисленных в комментариях: нет необходимости модифицировать исходные данные, простые петли, только «простые» структуры данных ;

Один метода будет отслеживать ли вы видели элемент перед (я делаю это с логическим массивом):

int[] hand = {2,3,2,3,2,9,5,5,5,5,5,5,5}; 
boolean[] hasPair = new boolean[10]; 
for(int i = 0; i <= hand.length - 2 ; i++) { 
    for(int j= i + 1; j <= hand.length - 1; j++) { 
     if (hand[j] == hand[i]) { 
      hasPair[hand[j]] = true; 
     } 
    } 
} 
int count = 0; 
for (boolean b : hasPair) { 
    if (b) { 
     count += 1; 
    } 
} 
System.out.print(count); 

Это считается уникальными парами или «дубликатами», предполагает, что входной массив имеет междунар в {1, ..., 9}

1

Java 8

Если вы можете использовать Java 8, это довольно простой в использовании для потоков API для группы до элементов и проверить, сколько из них принадлежит по крайней мере, одна пара:

Integer[] data = { 2, 3, 2, 3, 2 }; 

    // create a map of each value to a list containing all instances of that value in the array 
    Map<Integer, List<Integer>> map = Arrays.stream(data).collect(Collectors.groupingBy(i -> i)); 

    // count how many of those lists have more than one element, i.e. pairs 
    long uniquePairs = map.values().stream().filter(l -> l.size() > 1).count(); 

    System.out.println(uniquePairs); 

Java 7

Если вы застряли с использованием Java 7, это немного сложнее, но вы можете создать карту, содержащую элементы в виде ключей, и количество раз, сколько раз они появляются в массиве в качестве значений. Затем вы можете пройти значения карты ищут элементы, которые имеют место, по крайней мере в два раза (т.е. принадлежит по крайней мере, одна паре):

Integer[] data = { 2, 3, 2, 3, 2 }; 

    // create a map of each element to a count of the times that element appears in the array 
    Map<Integer, Integer> map = new HashMap<>(); 
    for (int i : data) { 
     Integer oldCount = map.get(i); 
     int newCount = oldCount == null ? 1 : oldCount + 1; 
     map.put(i, newCount); 
    } 

    // count the number of elements that appear more than once, i.e. pairs 
    int uniquePairs = 0; 
    for (int i : map.values()) { 
     if (i > 1) uniquePairs++; 
    } 

    System.out.println(uniquePairs); 
+0

Я не думаю, что это будет учитывать пары, где количество записей больше 3, например: {2, 2, 2, 2, 3, 3} - должно ли это быть 3 пары в соответствии с проблемой spec? – Nic

+0

То, как я прочитал вопрос, {2,2,2,2,3,3} будет 2 уникальными парами, (2,2) и (3,3). – azurefrog

+0

Ах да, на втором взгляде я думаю, что ты прав. – Nic

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