Сортировка массива на основе другого массива

У меня есть 2 массива:

Первый состоит из имен лиц. Второй дает мне подсчет количества имен, появившихся на странице. Пример: Names=["James","Loiui","Mario","Peter"] count=[1,4,2,5]

теперь я попытался с этим кодом, приведенным ниже:

SortedMap<Integer, String> m = new TreeMap<Integer, String>();
for(int i = 0; i < Names.size(); i++)
        m.put( count.get(i),Names.get(i));

Но это не работает, если есть повторяющиеся значения count . Я понял, что проблема в TreeMap, так как он хранит только уникальные элементы. Теперь, чтобы преодолеть мою проблему, есть ли другие действительные решения.


person kiran    schedule 05.05.2014    source источник
comment
Имена, скорее всего, будут уникальными, поэтому вы должны использовать SortedMap<String, Integer>. Однако, если вашей целью является сортировка по количеству, используйте SortedMap<Integer, List<String>>.   -  person Alexis C.    schedule 05.05.2014
comment
Но я хочу, чтобы окончательный результат имел порядок убывания в зависимости от количества, то есть наиболее повторяющееся имя отображалось первым.   -  person kiran    schedule 05.05.2014
comment
Тогда вы можете использовать SortedMap<Integer, List<String>>, как я уже сказал.   -  person Alexis C.    schedule 05.05.2014
comment
Тогда у меня не может быть 2 одинаковых значения счетчика!   -  person kiran    schedule 05.05.2014
comment
Почему? Если у вас есть два одинаковых значения счетчика, у вас будет сопоставление этого значения со списком из 2 имен.   -  person Alexis C.    schedule 05.05.2014
comment
НЕТ.. Не совсем.. Я получаю только одно значение. Можете ли вы сказать, куда я иду? g : for (Entry‹Integer, List‹String›› i:m.entrySet()) { System.out.println(i.getValue()+\n+i.getKey()); System.out.println(i.getValue().size()); }   -  person kiran    schedule 05.05.2014
comment
Я не знаю, как вы заполняете свою карту, поэтому трудно ответить.   -  person Alexis C.    schedule 05.05.2014


Ответы (3)


Создайте класс PersonFrequency, содержащий имя и число. Создайте одиночный массив или список экземпляров PersonFrequency. Отсортируйте этот массив по количеству:

Пример Java 8:

List<PersonFrequency> list = new ArrayList<>(names.length);
for (int i = 0; i < names.length; i++) {
    list.add(new PersonFrequency(names[i], counts[i]);
}

list.sort(Comparator.comparing(PersonFrequency::getCount).reversed());

List<String> sortedNames = list.stream()
                               .map(PersonFrequency::getName)
                               .collect(Collectors.toList());

В Java 7 сортировка станет

Collections.sort(list, new Comparator<PersonFrequency>() {
    @Override
    public int compare(PersonFrequency p1, PersonFrequency p2) {
        return Integer.compare(p2.getCount(), p1.getCount());
    }
});
person JB Nizet    schedule 05.05.2014
comment
не могли бы вы уточнить. - person kiran; 05.05.2014
comment
Уточнить что? Разве код примера недостаточно понятен? - person JB Nizet; 05.05.2014
comment
Есть ли какие-либо средства, с помощью которых я могу использовать список PersonFrequency List в java 1.7? - person kiran; 05.05.2014
comment
Конечно. Вам просто нужно использовать Collections.sort() и определить Comparator, используя анонимный класс, а не лямбда. должны быть сотни вопросов о том, как сортировать список объектов в Java. Найдите их в Google или прочитайте мой отредактированный ответ. - person JB Nizet; 05.05.2014

Отсортировано по алфавиту

    String [] names = {"Aaa","Bbb"};
    int [] count = {1,2};

    SortedMap<String, Integer> m = new TreeMap<String, Integer>();

    for(int i = 0; i < names.length; i++){
        m.put(names[i], count[i]);
    }

Отсортировано по номеру:

    String [] names = {"Aaa","Bbb"};
    int [] count = {2,1};

    SortedMap<Integer, String> m = new TreeMap<Integer, String>();

    for(int i = 0; i < names.length; i++){
        m.put(count[i],names[i]);
    }

Для убывания измените свою отсортированную карту на эту

SortedMap<Integer, String> m = new TreeMap<Integer, String>().descendingMap();
person DavideBar    schedule 05.05.2014
comment
Согласовано ! Но я хочу, чтобы результирующий результат был отсортирован по количеству значений счетчика. а не по алфавиту! - person kiran; 05.05.2014

Как упоминалось в предыдущих комментариях, вы можете иметь отсортированную карту с параметрами Integer и ArrayList, как показано ниже:

SortedMap<Integer, ArrayList<String>> map=new TreeMap<Integer, ArrayList<String>>().descendingMap();

Так как вы хотите, чтобы результаты были в порядке убывания, я добавила DesingMap().

Мы используем ArrayList, потому что у вас могут быть дубликаты в массиве count. Одно и то же значение счетчика может иметь более одного имени. Таким образом, один счет будет иметь список имен.

И полный код ниже,

import java.util.ArrayList;
import java.util.SortedMap;
import java.util.TreeMap;



public class NameCount {

    public static void main(String[] args) {

        String[] names = {"James","Loiui","Mario","Peter"};
        int[] count = {1, 4, 2, 1};

        SortedMap<Integer, ArrayList<String>> map=new TreeMap<Integer, ArrayList<String>>().descendingMap();
        ArrayList<String> nameList=null;

        for(int i = 0; i < names.length; i++)
        {
            if(map.get(count[i])==null)
            {
                nameList = new ArrayList<String>();
                nameList.add(names[i]);
                map.put(count[i], nameList);
            }
            else
            {
                map.get(count[i]).add(names[i]);
            }
        }

        for(int countVal : map.keySet())
        {
            ArrayList<String> namesListVal=map.get(countVal);

            System.out.print("\nCount  "+countVal+ ":  NAMES  : ");
            for(String name : namesListVal)
            {
                System.out.print(name+"  ");
            }

        }
    }

}
person Dany    schedule 29.05.2014