【发布时间】:2019-02-08 04:25:44
【问题描述】:
我有这个要求,我需要解析一个文本文件并从中提取 n-gram 并将 n-gram 映射及其计数存储在映射中。现在,Map 键是可以包含 1,2,3 个单词的字符串。
例如("mango", 10), ("facbook朋友", 6), ("有钱人", 3) 1
示例映射:
("芒果", 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);
输出:{apple=1, mango tree=5, Bought new watch=2}
【问题讨论】:
-
定义自己的 compareTo 有什么问题,您必须比较字符串中空格的基数或数量,而不是长度。
-
@viveksinghggits 如果我只根据空格数定义 compareTo,那么地图将只有 3 个映射。
-
@Santosh 我需要根据键中的单词进行排序,而不是字符串值。
-
如何拥有两个具有相同键的映射条目? IE。 ("facebook 朋友", 3) 和 ("facebook 朋友", 8) 是不可能的,对吧?
标签: java collections hashmap treemap