Java 反转存储单词及其行号的哈希映射
我有一个哈希图Java 反转存储单词及其行号的哈希映射,java,hashmap,Java,Hashmap,我有一个哈希图 HashMap<String, LinkedList<Integer>> indexMap; 将显示 This [1] demonstrate [2] an [1 2] is [1 2] ... .... 1 [This, an, just, example, is] 2 [demonstrate, what, to, I, am, saying, is, an] 等等。我想反转这个HashMap,以便它显示存储在每个行号上的单词 对于上面的特定示例
HashMap<String, LinkedList<Integer>> indexMap;
将显示
This [1]
demonstrate [2]
an [1 2]
is [1 2]
...
....
1 [This, an, just, example, is]
2 [demonstrate, what, to, I, am, saying, is, an]
等等。我想反转这个HashMap,以便它显示存储在每个行号上的单词
对于上面的特定示例,它应该显示
This [1]
demonstrate [2]
an [1 2]
is [1 2]
...
....
1 [This, an, just, example, is]
2 [demonstrate, what, to, I, am, saying, is, an]
对于这个特殊的任务,这就是我所做的-
import java.io.FileReader;
import java.io.LineNumberReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
public class ReverseIndex {
private static Map<String, LinkedList<Integer>> indexMap = new HashMap<String, LinkedList<Integer>>();
public static LinkedList<Integer> getIndex(String word) {
return indexMap.get(word);
}
public static void main(String[] args) {
try {
LineNumberReader rdr = new LineNumberReader(
new FileReader(
args[0]));
String line = "";
int lineNumber = 0;
//CREATING THE INITIAL HASHMAP WHICH WE WANT TO REVERSE
while ((line = rdr.readLine()) != null) {
lineNumber++;
String[] words = line.split("\\s+");
for (int i = 0; i < words.length; i++) {
LinkedList<Integer> temp = new LinkedList<Integer>();
if (getIndex(words[i]) != null)
temp = getIndex(words[i]);
temp.add(lineNumber);
indexMap.put(words[i], temp);
}
}
//FINISHED CREATION
Map<Integer, LinkedList<String>> myNewHashMap = new HashMap<Integer, LinkedList<String>>();
for(Map.Entry<String, LinkedList<Integer>> entry : indexMap.entrySet()){
LinkedList<Integer> values = entry.getValue();
String key = entry.getKey();
LinkedList<String> temp = new LinkedList<String>();
for(int i = 0; i <= lineNumber; i++) {
if(values.contains(i)) {
if(!temp.contains(key))
temp.add(key);
myNewHashMap.put(i, temp);
}
}
}
for(Map.Entry<Integer, LinkedList<String>> entry : myNewHashMap.entrySet()){
Integer tester = entry.getKey();
LinkedList<String> temp2 = new LinkedList<String>();
temp2 = entry.getValue();
System.out.print(tester + " ");
for(int i = 0; i < temp2.size(); i++) {
System.out.print(temp2.get(i) + " ");
}
System.out.println();
}
rdr.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
如何反转它,使其与预期的输出完美配合?只需将main中的第一个for循环替换为以下代码即可。我已经按照惯例对原始代码做了一些更改,比如将变量声明移出循环,并以一种方式更改了逻辑,它检查行号的LinkedList是否已经存在,如果已经存在,请将其添加到列表中,或者创建一个新的LinkedList,然后添加word
LinkedList<Integer> values = null;
String key = null;
LinkedList<String> temp = null;
for(Map.Entry<String, LinkedList<Integer>> entry : indexMap.entrySet())
{
values = entry.getValue();
key = entry.getKey();
temp = new LinkedList<String>();
for(int value : values)
{
temp = myNewHashMap.get(value);
if(temp == null )
{
temp = new LinkedList<String>();
myNewHashMap.put(value,temp);
}
temp.add(key);
}
}
看起来每次要向新地图添加值时都在创建一个新列表。每行给你一个答案。如果尚未映射线,则只需创建新列表,否则将添加到列表中。看看你的可变温度和你总是在地图上做一个put的事实。