Группировать ключи карты JAVA на основе токенов в строковом ключе - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть это требование, когда мне нужно проанализировать текстовый файл, извлечь из него n-грамм и сохранить отображение n-грамм с их количеством на карте.Теперь ключ Map - это строка, в которой может содержаться 1,2,3 слова.

например ("mango", 10), ("facbook friend", 6), ("richguy ", 3) 1 <= n <= 3 </p>

Пример сопоставления:

(" манго ", 2)

(" яблоко ", 1)

("манговое дерево", 5)

("фейсбук друг", 3)

("фейсбук люди", 8)

("Новые часы ", 2)

Теперь я хочу отсортировать карту по длине лексем ключевых слов в ключе карты.как и все сопоставления из 1 слова, сначала в карте должно быть отображено 2 слова, затем 3 слова.

Я пытался использовать TreeMap, но основная задача заключалась в определении функции compareTo для порядка сортировки.Есть идеи?Подобный ниже метод не работает.

    Map<String, Integer> m = new TreeMap<>(Comparator.comparingInt(k -> k.split(" ").length));

    m.put("mango tree", 5);
    m.put("Bought new watch", 2);
    m.put("apple", 1);
    m.put("mango tree", 5);
    m.put("Bought new watch", 2);
    m.put("appl1", 1);
    m.put("mango 1", 5);
    m.put("Bought 1 watch", 2);
    m.put("appl2", 1);
    m.put("mango 2", 5);
    m.put("Bought 2 watch", 2);
    m.put("appl3", 1);
    System.out.println(m);

Вывод: {яблоко = 1, манговое дерево = 5, купил новые часы = 2}

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Следующий код вставляет записи по порядку.

    SortedMap<String, Integer> m = new TreeMap<>(new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            int s2length = s2.split(" ").length;
            int s1length = s1.split(" ").length;
            return s2length>s1length?-1:s2length==s1length && s2.equals(s1)?0:1;
        }
    });

    m.put("mango tree", 5);
    m.put("you have to check this out too", 1);
    m.put("apple", 1);
    m.put("apple", 5);
    m.put("you have to check this out", 1);
    m.put("check this out", 1);
    m.put("Bought new watch", 2);
    m.put("check this out too", 1);

    System.out.println(m);
0 голосов
/ 08 февраля 2019

Вы можете сделать это, используя Collectors.toMap с заказанным поставщиком карт, например:

Map<String, Integer> m = new HashMap<>();
m.put("mango tree", 5);
m.put("Bought new watch", 2);
m.put("apple", 1);

LinkedHashMap<String, Integer> sortedMap = m.entrySet().stream()
        .sorted(Comparator.comparingInt(e -> e.getKey().split(" ").length))
        .collect(Collectors.toMap(Map.Entry::getKey,
                Map.Entry::getValue,
                (o1, o2) -> o1,
                LinkedHashMap::new));

System.out.println(sortedMap);

Выход

{apple=1, mango tree=5, Bought new watch=2}

Вы также можетеиспользуйте следующую строку .sorted(...:

.sorted(Map.Entry.comparingByKey(Comparator.comparingInt(k -> k.split(" ").length)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...