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的事实。