Упорядочение ArrayList с повторяющимися строками

#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();
        }
    });