Map<Object,String> mp=new HashMap<Object, String>();
Scanner sc=new Scanner(System.in);
System.out.println("Enter the instrument name");
String name=sc.next();
mp.put(name, "Control Valve");
mp.put(name, "BDV");
mp.put(name, "SDV");
mp.put(name, "ON-OFF VALVE");
mp.put(name,"Analyser");
Set s=mp.entrySet();
Iterator it=s.iterator();
while(it.hasNext())
{
Map.Entry m =(Map.Entry)it.next();
String key=(String)m.getKey();
String value=(String)m.getValue();
System.out.println("Instrument name :"+key+" fields:"+value);
}
}
}
在这个中,只有最后一个值被映射到密钥.i.e分析器到密钥。
如何将所有值映射到用户输入的一个键。还必须要求用户输入每个值字段的值。
更新代码 - :它要求输入仪器名称,但显示异常“java.util.ArrayList不能转换为java.lang.String”
Map<String,List<String>> mp=new HashMap<String,List<String>>();
Scanner sc=new Scanner(System.in);
System.out.println("Enter the instrument name");
String name=sc.next();
List<String> valList = new ArrayList<String>();
valList.add("Control Valve");
valList.add("BDV");
valList.add("SDV");
valList.add("ON-OFF VALVE");
valList.add("Analyser");
mp.put(name, valList);
Set s=mp.entrySet();
Iterator it=s.iterator();
while(it.hasNext())
{
Map.Entry m =(Map.Entry)it.next();
String key=(String)m.getKey();
String value=(String)m.getValue();
System.out.println("Instrument name :"+key+" fields:"+value);
}
}
}
答案 0 :(得分:3)
我建议使用
Map<Object,List<String>> mp=new HashMap<Object, List<String>>();
这样您就可以为给定的键维护一组值。
如果列表可用于给定键,则获取列表并将新值添加到列表中。
已更新
Map<String,List<String>> mp=new HashMap<String,List<String>>();
Scanner sc=new Scanner(System.in);
System.out.println("Enter the instrument name");
String name=sc.next();
List<String> valList = new ArrayList<String>();
valList.add("Control Valve");
valList.add("BDV");
valList.add("SDV");
valList.add("ON-OFF VALVE");
valList.add("Analyser");
mp.put(name,valList);
for(String key : mp.keySet()){
System.out.print("Instrument name :"+key+" Values : ");
for(String val : mp.get(key)){
System.out.print(val+",");
}
}
答案 1 :(得分:1)
我怀疑你应该使用一个带有字段的自定义类来获取所需的每条信息。这可以在地图中为每个名称添加一次
public static void main(String... args) {
Map<String, MyType> mp = new LinkedHashMap<String, MyType>();
Scanner sc = new Scanner(System.in);
System.out.println("Enter the following comma separated with a blank line to stop.");
System.out.println("instrument name, Control Value, BDV, SDV, ON-OFF VALVE, Analyser");
for (String line; (line = sc.nextLine()).length() > 0; ) {
MyType mt = new MyType(line);
mp.put(mt.getName(), mt);
}
System.out.println("you entered");
for (MyType myType : mp.values()) {
System.out.println(myType);
}
}
static class MyType {
private final String name, controlValue, bdv, sdv, onOffValue, analyser;
MyType(String line) {
String[] parts = line.trim().split(" *, *");
name = parts[0];
controlValue = parts[1];
bdv = parts[2];
sdv = parts[3];
onOffValue = parts[4];
analyser = parts[5];
}
public String getName() {
return name;
}
public String getControlValue() {
return controlValue;
}
public String getBdv() {
return bdv;
}
public String getSdv() {
return sdv;
}
public String getOnOffValue() {
return onOffValue;
}
public String getAnalyser() {
return analyser;
}
@Override
public String toString() {
return "MyType{" +
"name='" + name + '\'' +
", controlValue='" + controlValue + '\'' +
", bdv='" + bdv + '\'' +
", sdv='" + sdv + '\'' +
", onOffValue='" + onOffValue + '\'' +
", analyser='" + analyser + '\'' +
'}';
}
}
如果给出以下输入打印
Enter the following comma separated with a blank line to stop.
instrument name, Control Value, BDV, SDV, ON-OFF VALVE, Analyser
a,b,c,d,e,f
1,2,3,4,5,6
q,w,e,r,t,y
you entered
MyType{name='a', controlValue='b', bdv='c', sdv='d', onOffValue='e', analyser='f'}
MyType{name='1', controlValue='2', bdv='3', sdv='4', onOffValue='5', analyser='6'}
MyType{name='q', controlValue='w', bdv='e', sdv='r', onOffValue='t', analyser='y'}
答案 2 :(得分:0)
您可能需要使用google guava multimap来实现此目标。
类似于Map的集合,但可以将多个值与单个键相关联。如果您使用相同的键但不同的值调用put(K,V)两次,则multimap包含从键到两个值的映射。
(或)
将值更改为List并将具有相同键的所有值添加到该列表
示例:
List<String> valList = new ArrayList<String>();
valList.add(val1);
valList.add(val2);
mp.put(name, valList);
答案 3 :(得分:0)
我建议查看Guava MultiMap
类似于Map的集合,但可以关联多个值 用一把钥匙。如果您使用相同的键调用put(K,V)两次,但是 不同的值,multimap包含从键到两者的映射 值。
否则,您必须为某些Java集合实现Map
Strings
。这样可行,但由于每次输入新密钥时都必须初始化集合,并且如果密钥存在空集合,则添加到集合中会很麻烦。
答案 4 :(得分:0)
您可能有一个字符串数组的映射。然后你应该检索数组列表并添加新值。
Map<Object,ArrayList<String>> mp=new HashMap<Object, ArrayList<String>>();