Мне нужно пройти через массив и сравнить каждый элемент массива со всеми элементами одного и того же массива и узнать, какой из них повторяется больше раз; у меня есть что-то вроде этого
for (int x = 0; x < lista1.size(); x++) {
int temp = lista1.get(x);
for (int y = 0; y < lista1.size(); y++) {
if (temp == lista1.get(y)) {
System.out.println("temp"+temp);
System.out.println(lista1.get(y));
rep = rep + 1;
lista3.add(temp);
lista3.add(rep);
rep = 0;
}
}
Проблема в том, что это делает меня for каждого из них и не сравнивает каждый x со всеми y . И если у вас есть лучшее представление о том, как это сделать, я был бы признателен.
У вас будут проблемы, когда элементы будут повторяться в списке, у вас будет двойное количество повторений.
Чтобы использовать итеративный метод, у вас могут быть две переменные,
repe
которые будут общим количеством повторений числа в списке, и k в качестве индекса для вспомогательного списка.Итерируемся по списку, берем элемент и итерируемся во втором for, где условие, кроме типового ,
i< n
еще проверяет, что вспомогательный список не содержит!contains
элемента, ведь если он уже есть, значит, он элемент, который уже был оценен. мы избегаем повторенияВ конце внутреннего for мы сравниваем, что количество повторений больше 0, и если это так, мы добавляем элемент во вспомогательный список, увеличиваем индекс
k
, печатаем, а затем сбрасываем счетчик на 0Один из способов - использовать
Stream
метод collect для выполнения сокращенияlista
начального значения, которое в основном уменьшит его до группы ключей , значение которой будет присвоеноMap
, где ключ будет словом, а значение - общим числом повторений, для этого используется счетный класса CollectorsВ вашем коде есть несколько логических проблем.
Я не понимаю, почему вы говорите, что он не сравнивает все x со всеми y, потому что именно это он и делает.
Однако, если вы сравните все в обратном порядке, любые повторения будут для вас удвоены.
Обратите внимание, что для этого массива: {1,1,2,2}
Вы будете сравнивать:
1 с 1 ок (против себя) 1 с 1 ок (вторая 1) 1 с 2 нет 1 с 2 нет
Затем переходит ко второму 1 1 с 1 ок 1 с 1 ок (против себя) 1 с 2 нет 1 с 2 нет
Чтобы делать такие вещи, всегда сравнивайте вперед. Другими словами, исходя из того положения, в котором вы находитесь, вы всегда сравниваете с x+1, поэтому вы избегаете сравнения с самим собой, а также избегаете сравнения того, что вы уже сравнивали.
Кроме того, вы не должны сравнивать элемент, который вы уже сравнивали.После того, как вы отметили 1, вы не должны проверять его больше.
И чтобы узнать, какое из них повторяется больше раз, все, что вам нужно сделать, это иметь переменную с количеством повторений, а затем сравнить с количеством повторений, которое вы нашли для этого случая...
С помощью этого метода вы можете подсчитать, сколько раз повторяется каждое число.
Метод тестирования:
Вылет из:
Я сделал функцию для получения общего количества повторов в списке, который может быть вам полезен. В следующем примере я создаю цикл for для просмотра списка «list1», проверяю с помощью функции getRepetitions, сколько раз это число повторяется, и вывожу его через терминал.