#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;
}
Вот что происходит:
- Вы передаете массив целых чисел.
- Вы настраиваете сопоставление значений массива с количеством значений.
-
Вы проходите по массиву. Для каждого целого числа в массиве:
a. вы извлекаете текущее количество для этого значения массива
b. если значение не существует, то начните со значения 1
c. если значение для данного значения действительно существует в map, добавьте к нему единицу
d. если значение, полученное из map 1, превышает ваш предел в 3, значит, вы продемонстрировали, что в массиве есть значение, которое повторяется по меньшей мере три раза.
-
если вы доберетесь до конца цикла, так и не вернув 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, поскольку не должно быть никаких трех дубликатов.
Надеюсь, это поможет!