gpt4 book ai didi

java - 2D HashMap 的使用

转载 作者:行者123 更新时间:2023-12-02 04:53:49 24 4
gpt4 key购买 nike

我有一个文本文件作为输入,我试图找到文件中每个单词出现的次数以及它在每行出现的次数。因此,对于“banana”这个词,我想要一个如下输出:{banana: 5,0,0,1,1,1},这意味着“banana”在文本中出现 5 次,在第一行 (0) 中出现 2 次第二行出现 3 次。

我正在考虑使用 2D HashMap 来实现:

Map<String, Map<Integer, Integer>> 

其中 String 是单词,第一个 Integer 是单词出现的行,第二个 Integer 是该行中出现的次数。问题是我无法在代码中实现我的想法,因为我遇到了很多错误:

Map<Map<Integer,Integer>, String > hashOfHash = new HashMap<Map<Integer, Integer>, String>();


while (line!=null){
Map<Integer, Integer> hash = new HashMap<Integer, Integer>();
String[] words = line.split(" ");

for (String z:words){
if (hashOfHash.containsKey(z)) {
Integer r = hashOfHash.get(z);
r = r + 1;
} else {
hash.put(z, new Integer(1));
}
}

}

有人可以帮我解决这个问题吗?

最佳答案

我会创建一个类来为您包装您的功能:

public class WordInfo {

private int occurrences = 0; //Store total occurances
private final Map<Integer, Integer> lines = new TreeMap<>(); //Map line numbers to occurance counts

public void markLine(int line) {
Integer curr = this.lines.get(line);
if (curr == null) {
curr = 0;
}
this.lines.put(line, ++curr);
}

public int getOccurrences() {
return this.occurrences;
}

public int getOccurrencesAtLine(int line) {
return this.lines.containsKey(line) ? this.lines.get(line) : 0;
}

public Map<Integer, Integer> getOccurrenceLocations() {
return Collections.unmodifiableMap(this.lines);
}

}

然后,它就变成了适当管理您自己到此类的映射的问题(一些示例方法):

private final Map<String, WordInfo> wordInfo = new HashMap<>(); //Use to retrieve info about words

private WordInfo getInfo(String word) {
WordInfo back = this.wordInfo.get(word);
if (back == null) {
back = new WordInfo();
this.wordInfo.put(word, back);
}
return back;
}

public void markWord(String word, int line) { //Call upon occurance of a word
this.getInfo(word).markLine(line);
}

您使用的语言本质上是面向对象的,它有助于创建代表您的信息的对象,而不是组合大量令人困惑的集合和映射。

对于您的具体示例,您可以轻松转换为字符串,如下所示:

public String wordInfo(String word) {
StringBuilder sb = new StringBuilder("{");
WordInfo info = this.getInfo(word);
sb.append(word).append(": ").append(info.getOccurrences());
info.getOccurrenceLocations().entrySet().forEach(ent -> {
for (int i = 0; i < ent.getValue(); i++) { //#getValue() -> occcurences at a line
sb.append(",").append(ent.getKey()); //#getKey() -> line number
}
});
return sb.append("}").toString();
}

输出如下

{banana: 0} //no occurrences
{banana: 1,1} //one occurrence on line 1
{banana: 5,0,0,1,1,1} //5 occurrences, 2 on line "0", 3 on line "1"

关于java - 2D HashMap 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28974908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com