#java #android #arraylist #charts #duplicates
#java #Android #Список массивов #Диаграммы #дубликаты
Вопрос:
Ну, у меня есть ArrayList с некоторыми строками в нем, и я хочу получить количество дубликатов, которые есть в каждой строке, и упорядочить их от наибольшего числа до наименьшего, например :
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("b");
list.add("c");
list.add("a");
list.add("a");
list.add("a");
Set<String> uniqueSet = new HashSet<String>(list);
for (String temp : uniqueSet) {
System.out.println(temp ": " Collections.frequency(list, temp));
}
и я хочу сохранить 10 лучших значений для проекта построения графиков, поэтому мне не нужно просто их печатать, мне нужно куда-то поместить результат, например, когда я вызываю «a», он дает мне 3.
Комментарии:
1. почему вызов «a» даст «3»?
2. более полезной структурой данных была бы карта, где вы можете сохранить счетчик вместе с символом в качестве ключа.
3. о, я понимаю, почему. но какое это имеет отношение к Android?
4. @ItamarGreen как я уже писал, мой проект построения графиков предназначен для приложения для Android, и я использую MPchart android
5. о, теперь я понимаю. Вы проверяли мой ответ на платформе Android? Я сам давно не разрабатывал Android, поэтому я очень рад этому XD.
Ответ №1:
Чтобы сопоставить строку с int (буквой с частотой), вы можете использовать объект Map:
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("b");
list.add("c");
list.add("a");
list.add("a");
list.add("a");
Collections.sort(list);
Map<String, Integer> map = new HashMap<String,Integer>();
for (String string : list) {
if(!map.containsKey(string)){
map.put(string, Collections.frequency(list, string));
}
}
и затем карта содержит нужную информацию.
Хэш-карта — это удобный способ хранения информации, которая имеет уникальные ключи, и для каждого ключа есть значение.
Комментарии:
1. не думайте о коллекциях. здесь действительно требуется сортировка.
2. Коллекции. сортировка — это просто еще один способ убедиться, что ключи остаются уникальными. но я согласен, не очень нужно
3. @brso05 увеличение значения на карте очень громоздко и очень неудобно.
4. ну, я бы так и сделал, но вопрос конкретно касается arraylist. Я понятия не имею, нужно ли это для метода в другой части программы
5. использование только карт — довольно простой и более используемый подход для счетчиков частоты. Кроме того, он не полагается на коллекции. frequency(), что является не очень экономичной реализацией.
Ответ №2:
Мультинабор guava был бы подходящим, он работает как набор, но записывает количество элементов.
Multiset<String> letters = ImmutableMultiset.of("a", "b", "d", "b", "a", "a", "a", "i", "f");
// [a x 4, b x 2, d, f, i]
letters.count("a");
// 4
Получить верхние элементы подсчета тоже не так уж сложно.
Multiset<String> top3 = LinkedHashMultiset.create();
letters.entrySet().stream()
.sorted((l1, l2) -> Integer.compare(l2.getCount(), l1.getCount()))
.limit(3)
.forEach(e -> top3.add(e.getElement(), e.getCount()));
// [a x 4, b x 2, d]
Ответ №3:
Ну, как некоторые из вас упомянули ООП, я создал класс модели с 2 переменными и установщиками получения, и я поместил ‘temp’ в name и ‘Collections.frequency(list, temp)’ в Fre, а затем я попытался перечислить некоторые объекты и упорядочил их с помощью следующего кода:
Collections.sort(jList, new Comparator<GetJournalsModel>() {
@Override
public int compare(GetJournalsModel a1, GetJournalsModel a2) {
return a1.getFre() - a2.getFre();
}
});