Проверка на повторяющиеся числа в int[] Java

#java #sorting

#java #сортировка

Вопрос:

Я хочу иметь возможность определить, появляется ли какое-либо число в int [] 3 или более раз? Как я могу это сделать?

Было бы здорово иметь метод

 boolean hasTriples(int[] numbers) {

//some code

}
  

Комментарии:

1. «Было бы здорово иметь метод» — Это был бы вопиющий случай «раздувания библиотеки», IMO.

2. lol Я согласен, хотя я имел в виду формат, в котором я хотел бы получить ответ.

Ответ №1:

Создайте Map<Integer, Integer> , и пусть целое число n соответствует количеству вхождений n.

Выполните цикл по массиву, чтобы заполнить карту, затем выполните цикл по ключам на карте, чтобы проверить, какие ключи соответствуют значению > = 3.

Вот некоторый код, который поможет вам начать:

 int[] arr = { 1, 3, 2, 3, 3, 4, 2, 2 };
Map<Integer, Integer> counts = new HashMap<Integer, Integer>();

// Count occurrencies
for (int i : arr) {
    if (!counts.containsKey(i))
        counts.put(i, 0);
    counts.put(i, 1   counts.get(i));
}

// Print how many times each number occurs in arr.
for (int i : counts.keySet())
    System.out.printf("i: %d, count: %d%n", i, counts.get(i));
  

Ответ №2:

    public boolean anyRepeatThreeTimes( int [] array ) {
      Map<Integer, Integer > map = new HashMap<Integer, Integer>();
      for ( int index = 0; index < array.length; index   ) {
         Integer total = map.get(array[ index ]);
         int count;
         if ( total == null ) {
            count = 1;
         }
         else {
            count = total   1;
            if ( count >= 3 ) {
               return true;
            }
         }
         map.put( array[ index ], count );
      }

      return false;
   }
  

Вот что происходит:

  1. Вы передаете массив целых чисел.
  2. Вы настраиваете сопоставление значений массива с количеством значений.
  3. Вы проходите по массиву. Для каждого целого числа в массиве:

    a. вы извлекаете текущее количество для этого значения массива

    b. если значение не существует, то начните со значения 1

    c. если значение для данного значения действительно существует в map, добавьте к нему единицу

    d. если значение, полученное из map 1, превышает ваш предел в 3, значит, вы продемонстрировали, что в массиве есть значение, которое повторяется по меньшей мере три раза.

  4. если вы доберетесь до конца цикла, так и не вернув true, то вместо этого верните false, потому что никакое значение не повторяется 3 раза.

Комментарии:

1. это выглядит именно так, как я хочу, хотя было бы здорово немного разобраться в том, как работает код, и в идее, стоящей за этим.

2. как насчет использования вместо этого цикла foreach?

3. @Seth — просто. И это решение, и @aioobe создают временную «карту», которая используется для подсчета количества раз, когда каждое целое число встречается во входном массиве.

4. @Bohemian — возможно, но изменение, скорее всего, будет чисто косметическим. Возможны и другие косметические изменения.

5. Я согласен. foreach было бы лучше. Я немного успокоился, когда увидел ответ aloobe выше. =)

Ответ №3:

Вот способ сделать это без использования каких-либо дополнительных классов, таких как класс Map. Это может быть медленнее, но, надеюсь, проще для понимания.

 public boolean hasTriples(int[] list) {
    for (int i = 0; i < list.length; i  ){
        int duplicates = 0;

        for (int j = i 1; j < list.length; j  ){
            if (list[i] == list[j]) {
                duplicates  ;
                if (duplicates >= 3) return true;
            }
        }
    }
    return false;
}
  

Вот что делает этот код. Внешний цикл for выполняется по списку, чтобы убедиться, что каждое значение проверяется на наличие дубликатов. Внутренние циклы выполняются через remeinder списка, чтобы проверить, сколько в нем повторяющихся значений. Если найдено три или более дубликатов, функция вернет true и не обработает остальную часть списка. Если внешний цикл for завершается без метода, возвращающего true, возвращается false, поскольку не должно быть никаких трех дубликатов.

Надеюсь, это поможет!