我正在尝试打印我的地图,以显示每个print语句的键和值。我有重复的键和重复的值。例如:
key -> value
house -> dog
house -> cat
dog -> house
dog -> cat
cat -> house
cat -> bike
这是我的文字档案:
house cat
house dog
house index
cat bike
cat house
cat index
dog house
dog cat
dog index
由于某种原因,我的代码是打印字符串“index”而不是实际值。 我的代码在这里:
//adding values from a text file of two words per line.
//those two words per line in the text file are tab delimitted
public static Map<String, String> animals = new HashMap<String, String>();
BufferedReader in = new BufferedReader(new InputStreamReader("animals.txt"));
String current_line;
String[] splitted_strings = new String[1];
while ((current_line = in.readLine()) != null){
splitted_strings = current_line.split("\t");
animals.put(splitted_strings[0], splitted_strings[1]);
}
//print statement
for(Map.Entry entry : animals.entrySet())
System.out.println(entry.getValue() + " " + entry.getKey());
我的代码中的简单print语句的输出如下所示:
index cat
index house
index dog
如何将这些值添加到数据结构中以保持上面的密钥对? 我怎样才能得到输出?:
house cat
house dog
house index
cat bike
cat house
cat index
dog house
dog cat
dog index
答案 0 :(得分:5)
我有重复的密钥和重复的值。
不,不。不在Map<K,V>
。根据定义,键是唯一的。
如果您想要每个键的多个值,则需要Guava的Multimap
。
但是,如果您提供的代码实际上是为每个值打印“索引”,那么我强烈怀疑地图是不正确的,并且您的人口代码中有一个错误(我们可以'见)。 (或者,或者您使用一些自定义类作为值,并且其toString
方法始终返回“index”。)
您应退后一步,查看您的人口代码。
编辑:我修改了你的示例代码,以便编译,以便提出:
import java.io.*;
import java.util.*;
public class Test {
public static void main(String[] args) throws IOException {
Map<String, String> animals = new HashMap<String, String>();
BufferedReader in = new BufferedReader
(new InputStreamReader(new FileInputStream("animals.txt")));
String current_line;
String[] splitted_strings = new String[1];
while ((current_line = in.readLine()) != null){
splitted_strings = current_line.split("\t");
animals.put(splitted_strings[0], splitted_strings[1]);
}
for(Map.Entry entry : animals.entrySet())
System.out.println(entry.getValue() + " " + entry.getKey());
}
}
使用animals.txt:
key1 value1
key2 value2
key3 value3
key4 value4
输出结果为:
value4 key4
value3 key3
value2 key2
value1 key1
根本没有“索引”的迹象。所以这不是你真正的人口代码(除了编译错误),或者你的文本文件对每个值都有“索引”......
答案 1 :(得分:1)
作为使用Guava的替代方法,您可以根据Map<String,Set<String>>
推出自己的多图。
添加键值对时,首先检查键是否已存在。如果没有,请将其与仅包含新值的Set放在一起。如果密钥已存在,请获取其Set并添加新值。
要检查对是否存在,请获取密钥的设置,并查看它是否包含值。