-1

我有这个 HashMap 包含单词和给定文本文件中每个单词的计数;

{word=1, word2=1, word3=2, word4=1, word5=1, word6=4, word7=1, word8=1};

我在其他主题中遵循您的建议;但我注意到,如果使用 fro example sorted Collections 并且我搜索一个特定的 KEY,在这种情况下它可能是 1 它只返回一个单词,而可以为同一个键返回更多值;

关键是在所有集合之间:

Lists Maps ArrayLists Trees HashMaps HashTables

哪个是最可取的使用?

在我的课堂上,用户将输入一个 int 并且该 int 将对应于第一个或第二个或第三个或第四个等等......文件中使用的单词基于计数和出现;

这很有挑战性

到目前为止,我已经设法将其存储在 hashmap 中,并最终通过 Desc Key 在 Tree 中排序;所以第一个元素会更大;但算法仍然需要更多的意义;

附言。我不期望解决方案或代码片段,而是一个好的输入开始......一个非常好的建议或最好遵循的方向;

4

2 回答 2

0

从本质上讲,地图每个键只存储(将返回)一个元素。这意味着如果您将存储[key:1, val:a]然后再次存储[key:1, val:2]。第二次插入将覆盖第一次,当您“获取”时key:1,返回的结果将是b.

但是,您可以为每个键存储一个列表。此列表可以存储每个相同键的所有值值。因此,我们将声明我们将使用的映射如下:

Map<String, LinkedList<String>> map = new HashMap<>();

这就是插入的样子:

public void insert(String key, String value){
    List<String> values = map.get(key);
    if (values == null){ // this is the first time we use this key
        values = new LinkedList<String>(); // so we need to create a new values List
    }
    values.add(value);
    map.put(key, values)
}

“获取”非常简单:
您获取值列表,如果它不为空 - 迭代值并打印/对它们执行任何您想要的操作。

public List<String> get(String key){
    return map.get(key);
}
于 2013-12-29T03:38:36.760 回答
0

如果我理解正确,你有一个Map<String,Integer> map;将单词映射到它们的频率,现在你想按频率查找单词。

创建一个新地图Map<Integer,List<String>>并使用第一张地图填充它:

Map<Integer,List<String>> reverseMap = new HashMap<>();
for (Map.Entry<String,Integer> entry : map.entrySet()) {
    List<String> list = reverseMap.get(entry.getValue());
    if (list == null) {
        reverseMap.put(entry.getValue(), list = new ArrayList<>());
    }
    list.add(entry.getKey());
}

你会得到一个像这样的地图:

java.util.HashMap[3] {
    1=[word2, word4, word, word5, word7, word8]
    2=[word3]
    4=[word6]
}

在这张地图中,每个键是频率,每个值是具有该频率的单词列表。

编辑:要提取使用频率第二高的单词(“排名 2”),生成最常用频率的列表:

List<Integer> frequencies = new ArrayList<>(reverseMap.keySet());
Collections.sort(frequencies, Collections.reverseOrder());

然后:

System.out.println(reverseMap.get(frequences.get(2 - 1)));

或者,要按频率降序(4、2、1)对整个映射进行排序,请将其声明为 TreeMap 而不是 HashMap,并使用 reverseOrder 比较器:

Map<Integer,List<String>> reverseMap = new TreeMap<>(Collections.reverseOrder());
于 2013-12-29T03:43:07.690 回答