Java 拔出“a专用”按钮;排名;来自尚未排序的HashMap,该HashMap还包含不同的值,但相同的键或更好的相同计数;

Java 拔出“a专用”按钮;排名;来自尚未排序的HashMap,该HashMap还包含不同的值,但相同的键或更好的相同计数;,java,sorting,hashmap,word-count,ranking-functions,Java,Sorting,Hashmap,Word Count,Ranking Functions,我有这个HashMap,其中包含单词和给定文本文件中每个单词的计数 {word=1,word2=1,word3=2,word4=1,word5=1,word6=4,word7=1,word8=1} 我在其他话题上也遵循了你的建议;但我注意到,如果使用示例排序集合,我搜索一个特定的键,这个键可能是1,在这种情况下,它只返回一个单词,而可以为同一个键返回更多值 点位于所有集合之间: 列表 地图 阵列主义者 树 散列图 哈希表 哪一种最适合使用 在我的类中,用户将输入一个int,该int将对应于第一个

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

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

我在其他话题上也遵循了你的建议;但我注意到,如果使用示例排序集合,我搜索一个特定的键,这个键可能是1,在这种情况下,它只返回一个单词,而可以为同一个键返回更多值

点位于所有集合之间:

列表 地图 阵列主义者 树 散列图 哈希表

哪一种最适合使用

在我的类中,用户将输入一个int,该int将对应于第一个或第二个或第三个或第四个,依此类推。。。。。基于计数和发生次数的文件中使用的单词

这很有挑战性

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

我不期望解决方案或代码片段,但一个良好的输入开始。。。最好遵循的非常好的建议或方向

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

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

Map<String, LinkedList<String>> map = new HashMap<>();
Map Map=newhashmap();
以下是insert的外观:

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 void插入(字符串键、字符串值){
列表值=map.get(键);
如果(values==null){//这是我们第一次使用这个键
values=newlinkedlist();//所以我们需要创建一个新的值列表
}
增加(价值);
map.put(键、值)
}
“get”非常简单:
您将获得值列表,如果它不是null,则迭代这些值并打印/处理它们

public List<String> get(String key){
    return map.get(key);
}
公共列表获取(字符串键){
返回map.get(key);
}

如果我理解正确,您有一张
地图
将单词映射到其频率,现在您希望按频率查找单词

创建一个新地图,该地图
map
,并使用第一个地图填充:

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());
}
在这个映射中,每个键都是频率,每个值都是具有该频率的单词列表

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

List<Integer> frequencies = new ArrayList<>(reverseMap.keySet());
Collections.sort(frequencies, Collections.reverseOrder());
或者,要按频率降序(4、2、1)对整个映射进行排序,请使用反向顺序比较器将其声明为树映射而不是哈希映射:

Map<Integer,List<String>> reverseMap = new TreeMap<>(Collections.reverseOrder());
Map reverseemap=newtreemap(Collections.reverseeorder());

如果我说:int rank=3;它应该实际地返回我“word8 word7 word5 word4 word3 word3”,因为第三级等于计数1,对于计数1,我在上面一行列出了这5个单词;如果显然我输入的秩=2,它应该只显示“word3”,第二个秩是“word3”,计数为2;希望让我明白我想要实现的目标;你认为我可以创建类似DB Table的东西吗;你认为我可以创建类似DB Table的东西吗;有3个不同的列{RANK(1)COUNT/WORD(4=[word6])}-{RANK(2)COUNT/WORD(2=[word3])}-{RANK(3)COUNT/WORD(1=[word2,word4,WORD,word5,word7,word8])。。。。。然后我将从主输入2,它将返回单词3,因为它是第二个最常用的单词…然后如果我输入5,它将返回NULL,因为没有第五个最常用的单词;你的例子很好,它给出了一个想法;但是,我认为使用SQL逻辑是非常重要的:);我认为JAVA在这方面是有限的;也许只是我是个业余爱好者?
System.out.println(reverseMap.get(frequences.get(2 - 1)));
Map<Integer,List<String>> reverseMap = new TreeMap<>(Collections.reverseOrder());