Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
4 / 4 / 1
Регистрация: 02.05.2015
Сообщений: 124
1

Как отсортировать map по значению?

05.09.2016, 02:11. Просмотров 2187. Ответов 11
Метки нет (Все метки)

Задача: Ввести с консоли n целых чисел. На консоль вывести: Числа в порядке убывания частоты встречаемости чисел.
Я нашла по сколько раз число встречается в массиве и занесла в мапу (ключ - число из массива, значение - сколько раз оно там встречается). А как эту мапу отсортировать по значению, чтобы вывести числа в порядке убывания частоты встречаемости.
Вот что у меня есть:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package VarB10;
 
import java.util.*;
 
/**
  * Ввести с консоли n целых чисел. На консоль вывести: Числа в порядке убывания частоты встречаемости чисел.
 */
public class VarB10 {
    int[] masInteger;
    int n;
 
    private void setN(){
        Scanner scanner = new Scanner(System.in);
        System.out.print("Введите количество чисел: ");
        n = scanner.nextInt();
        masInteger = new int[n];
    }
 
    private int getN(){
        return n;
    }
 
    private void inputMasInteger(int n){
        Scanner scanner = new Scanner(System.in);
        System.out.print("Введите " + n + " целых чисел: ");
        for (int i = 0; i < n; i++) {
            masInteger[i] = scanner.nextInt();
        }
    }
 
    private HashMap<Integer, Integer> createMap(int[] mas) //мапа хранит ключи-значение в массиве, значение-количество ключей в массиве
    {
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (int i = 0; i < mas.length ; i++) {
            map.put( mas[i], getCount(masInteger, mas[i]));
        }
        return (HashMap)map;
    }
 
    public static int getCount(int[] mas, int name) //для поиска одинаковых значнеий
    {
        int count = 0;
        for (int i = 0; i < mas.length; i++) {
            if (name==(mas[i])) {
                count ++;
            }
        }
        return count;
    }
 
    public static void main(String[] args) {
        VarB10 c = new VarB10();
        c.setN();
        c.inputMasInteger(c.getN());
        Map<Integer, Integer> map = c.createMap(c.masInteger);
        Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
        while (iterator.hasNext())
        {
            Map.Entry<Integer, Integer> pair = iterator.next();
            Integer key = pair.getKey();            //ключ
            Integer value = pair.getValue();        //значение
            System.out.println(key + ":" + value);
        }
    }
}
Добавлено через 49 минут
Переписала решение с ArrayList вместо простого массива:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package VarB10;
 
import java.util.*;
 
/**
 * Ввести с консоли n целых чисел. На консоль вывести: Числа в порядке убывания частоты встречаемости чисел.
 */
public class VarB10 {
    ArrayList<Integer> masInteger = new ArrayList<Integer>();
    int n;
 
    private void setN(){
        Scanner scanner = new Scanner(System.in);
        System.out.print("Введите количество чисел: ");
        n = scanner.nextInt();
    }
 
    private int getN(){
        return n;
    }
 
    private void inputMasInteger(int n){
        Scanner scanner = new Scanner(System.in);
        System.out.print("Введите " + n + " целых чисел: ");
        for (int i = 0; i < n; i++) {
            masInteger.add(scanner.nextInt());
        }
    }
 
    private HashMap<Integer, Integer> createMap(ArrayList<Integer> mas) //мапа хранит ключи-значение в массиве, значение-количество ключей в массиве
    {
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (int i = 0; i < mas.size() ; i++) {
            map.put( mas.get(i), getCount(masInteger, mas.get(i)));
        }
        return (HashMap)map;
    }
 
    public static int getCount(ArrayList<Integer> mas, int name) //для поиска одинаковых значнеий
    {
        int count = 0;
        for (int i = 0; i < mas.size(); i++) {
            if (name==mas.get(i)) {
                count ++;
            }
        }
        return count;
    }
 
    public static void main(String[] args) {
        VarB10 c = new VarB10();
        c.setN();
        c.inputMasInteger(c.getN());
        Map<Integer, Integer> map = c.createMap(c.masInteger);
        Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
        while (iterator.hasNext())
        {
            Map.Entry<Integer, Integer> pair = iterator.next();
            Integer key = pair.getKey();            //ключ
            Integer value = pair.getValue();        //значение
            System.out.println(key + ":" + value);
        }
    }
}
А как отсортировать не знаю (((
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.09.2016, 02:11
Ответы с готовыми решениями:

Как отсортировать Map по значению
Ребятки всем добра! Подскажите как отсортировать Map по значению. Что имеется в виду! Есть карта...

Отсортировать контейнер map по значению элементов
Есть заполненный контейнер unordered_map (ну или просто map) Нужно отсортировать его по значению...

Как получить индекс по значению map
std::map&lt;string, string&gt; m {{&quot;123&quot;, &quot;shit&quot;}, {&quot;321&quot;, &quot;govno&quot;}, {&quot;234&quot;, &quot;curva&quot;}}; return...

Map с поиском как по ключу, так и по значению
Реализовано ли подобное в stl? (или в boost, например) И как в теории выглядит эта реализация?...

11
2714 / 2333 / 718
Регистрация: 05.07.2013
Сообщений: 11,368
05.09.2016, 08:00 2
Java
1
map.entrySet().stream().sorted((n1,n2)->n1.getValue().compareTo(n2.getValue())).forEach(n->System.out.println(n));
1
4 / 4 / 1
Регистрация: 02.05.2015
Сообщений: 124
05.09.2016, 17:24  [ТС] 3
А что такое n1 и n2? Eще и на stream ругается. Я ж начинаю только изучать, попробую понять. Спасибо за ответ
0
Эксперт Java
2345 / 2178 / 555
Регистрация: 28.12.2010
Сообщений: 8,526
05.09.2016, 18:59 4
Адэля, Java 8 установите
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10859 / 6738 / 1618
Регистрация: 25.07.2009
Сообщений: 12,476
06.09.2016, 15:27 5
Была недавно такая тема - Вывести на консоль числа в порядке убывания частоты встречаемости чисел там всякие были решения, включая и совсем простое с двумя массивами. Если хочется непременно с Map и 8 яву ставить лень, то как вариант:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.*;
 
class SortMapByVal {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        
        System.out.print("Number of integers: ");
        int n = scanner.nextInt();
        assert ( n > 0 );
        while ( n-- > 0 ) {
            System.out.print("> ");
            int i = scanner.nextInt();
            map.put(i, ( map.containsKey(i) ) ? map.get(i) + 1 : 1);
        }
        
        System.out.println("\nNumber\tMeets");
        List<Map.Entry<Integer, Integer>> list = new LinkedList<Map.Entry<Integer, Integer>>(map.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {
            public int compare(Map.Entry<Integer, Integer> a, Map.Entry<Integer, Integer> b) {
                return ( b.getValue() - a.getValue() );
            }
        });
        for ( Map.Entry<Integer, Integer> me : list )
            System.out.println(me.getKey() + "\t" + me.getValue());
        
    }
}
Код
[andrew@andrew numbers]$ javac SortMapByVal.java 
[andrew@andrew numbers]$ java SortMapByVal
Number of integers: 10
> 5
> 4
> 4
> 8
> 1
> 3
> 1
> 1
> 1
> 8

Number	Meets
1	4
4	2
8	2
3	1
5	1
[andrew@andrew numbers]$
1
4 / 4 / 1
Регистрация: 02.05.2015
Сообщений: 124
06.09.2016, 19:04  [ТС] 6
easybudda, да мне не лень поставить 8 Java. А где ее брать? У меня установлено следующее: ideaIC-2016.2.3 и jdk-8u101. Подскажите где взять 8 Java? Это что-то другое?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10859 / 6738 / 1618
Регистрация: 25.07.2009
Сообщений: 12,476
06.09.2016, 19:56 7
Цитата Сообщение от Адэля Посмотреть сообщение
jdk-8u101
Так вот же... Другое дело, где-нибудь в настройках
Цитата Сообщение от Адэля Посмотреть сообщение
ideaIC-2016.2.3
может быть установлено что-нибудь вроде "компилировать в байткод для java 7", но где там такая пимпа, если вообще есть, я не знаю. Попробуйте код с
Цитата Сообщение от xoraxax Посмотреть сообщение
map.entrySet().stream().sorted((n1,n2)->n1.getValue().compareTo(n2.getValue())).forEach(n->System.out.println(n));
в консоли собрать...
0
Эксперт Java
4064 / 3798 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
07.09.2016, 11:02 8
Цитата Сообщение от Адэля Посмотреть сообщение
А что такое n1 и n2? Eще и на stream ругается
Как ругается то?
0
4 / 4 / 1
Регистрация: 02.05.2015
Сообщений: 124
07.09.2016, 22:38  [ТС] 9
easybudda, спасибо, покапаюсь в настройках. А как с консоли собирать я не умею( Где про это почитать?

Добавлено через 1 минуту
turbanoff, точнее не ругается, а просто красным пишет, может какой пак ее подключить надо. Я только вторую неделю в Java

Добавлено через 43 минуты
easybudda, все получилось, подключила 8. У меня оказывается и 7 была установлена
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10859 / 6738 / 1618
Регистрация: 25.07.2009
Сообщений: 12,476
07.09.2016, 23:15 10
Цитата Сообщение от Адэля Посмотреть сообщение
все получилось, подключила 8. У меня оказывается и 7 была установлена
"А ларчик ломом открывался..." (с)

Цитата Сообщение от Адэля Посмотреть сообщение
А как с консоли собирать я не умею
Сохраняете программу в файл с именем точно таким же, как имя класса, содержащего main() и с расширением .java
Для простоты можно выпилить из него объявление package, если есть, ну или морочиться с созданием соответствующих папок, что для простенького учебного примера лишние заморочки. Открываете консоль, переходите (командой cd) в папку с программой и пишете
javac MyGreatestAppClass.java
Ну и чтобы запустить
java MyGreatestAppClass
Только при этом важно, чтобы ява была правильно установлена (в переменных среды пользователя должно присутствовать
JAVA_HOME со значением c:\java\jdk1.8.0_101
или куда там оно у Вас установлено)
1
31 / 31 / 12
Регистрация: 25.07.2015
Сообщений: 120
08.09.2016, 16:33 11
Адэля, Вы бы пока IDE в сторонку убрали. В книгах по Java не просто так рекомендуют первое время использовать только блокнотик и консоль. Освоитесь с командами консоли, разберетесь с пакетами, а там уже через какое-то время начнете в IDE работать.
0
Эксперт Java
2345 / 2178 / 555
Регистрация: 28.12.2010
Сообщений: 8,526
08.09.2016, 18:22 12
Цитата Сообщение от striker24 Посмотреть сообщение
В книгах по Java не просто так рекомендуют первое время использовать только блокнотик и консоль.
что же ещё могут рекомендовать книги прошлого века....хорошо хоть ещё компьютер разрешают использовать. Писать в блокноте и компилировать в консоли в 2016 году это никому ненужный навык.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.09.2016, 18:22

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как отсортировать массив по первому значению?
Подскажите пожалуйста, как отсортировать этот массив по первому значению tempArray.Name? public...

Как отсортировать карту( Map<String, Long> ) сначала по значениям, а потом по ключу
Добрый вечер. Интересует вопрос как отсортировать карту(Map&lt;String, Long&gt;) сначала по значениям,...

Сортировка map по значению
Здорова господа!!! Есть массив: map&lt;string, int&gt; m; m=3; m=2; m=10; Нужно найти...

Сортировка map по значению
Доброго времени суток как можно безболезненно отсортировать map по значению? я пробовал bool...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.