这是文本文件。 K:表示键,V:表示我想要输入的列表中的值。即:草莓,杏和桃子在地图的关键A类中构成清单。
K: Class A//
V: Strawberry//
V: Apricot//
V: Peach//
K: Class B//
V: Chocolate//
K: Class C//
V: Creme de menthe//
V: Irish coffee//
此处的程序正确分配了键,但是将文件中的每个值添加到列表而不是我想要的值。
//FillHM.java
import java.io.*;
import java.util.Scanner;
import java.util.*;
public class FillHM {
public static void main (String[] args) {
Map<String, List<String>> map = new HashMap<String, List<String>>();
Scanner sc1 = null;
try {
sc1 = new Scanner(new File("/home/craig/Desktop/mytext.txt"));
}catch (FileNotFoundException e) {e.printStackTrace();}
List<String>values = new ArrayList<>();
String s = " ";
String key = " ";
while (sc1.hasNextLine()) {
Scanner sc2 = new Scanner(sc1.nextLine());
sc2.useDelimiter("//");
while(sc2.hasNext()) {
s = sc2.next();
if (s.startsWith("K:")) {
key = s;
}
if (s.startsWith("V:")) {
values.add(s);
}
map.put(key, values);
} //end while
} //end while
System.out.println(map);
}
}
答案 0 :(得分:3)
当您检测到新密钥时,请创建一个新列表:
if (s.startsWith("K:")) {
key = s;
values = new ArrayList<>();
}
如果您不这样做,每个密钥都将映射到相同的列表。您希望每个键都映射到自己的列表。
答案 1 :(得分:1)
问题是,你不能使用values.clear(),因为它会清除所有键的值。 以下是解决方案。
if (s.startsWith("K:")) {
values = new ArrayList<>();
key = s;
}
只需更改此if
即可。
答案 2 :(得分:0)
问题是当密钥更改时,您的值列表永远不会清除。 因此,请确保在向地图添加键和值时清除列表
if (s.startsWith("K:")) {
key = s;
values.clear();
}
答案 3 :(得分:0)
我想这段代码适合你的伙伴。 values.clear() 无法解决问题。
Map<String, List<String>> map = new HashMap<String, List<String>>();
Scanner sc1 = null;
try {
sc1 = new Scanner(new File("/home/craig/Desktop/mytext.txt"));
}catch (FileNotFoundException e) {e.printStackTrace();}
String s = "";
String key = "";
List<String>values=new ArrayList<>();
while (sc1.hasNextLine()) {
Scanner sc2 = new Scanner(sc1.nextLine());
sc2.useDelimiter("//");
s = sc2.next();
if (s.startsWith("K:")) {
if(values.size()!=0){
map.put(key, values);
//System.out.println(map);
}
key = s;
values=new ArrayList<>();
}
else if (s.startsWith("V:")) {
values.add(s);
}
}
map.put(key, values);
System.out.println(map);