0
      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);
        }
    }
}

在这个唯一的最后一个值被映射到 key .ie 分析器到 key 。

如何将所有值映射到用户输入的一个键。它还必须要求用户为每个值字段输入值。

更新的代码-:它询问仪器名称,但随后显示异常“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);
        }
    }
}
4

5 回答 5

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+",");
          }


      }
于 2013-01-10T17:12:26.677 回答
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'}
于 2013-01-10T18:05:15.510 回答
0

您可能需要使用google guava multimap来实现此目的。

类似于 Map 的集合,但可以将多个值与单个键相关联。如果您使用相同的键但值不同的两次调用 put(K, V),则多重映射包含从键到两个值的映射。

(或者)

将值更改为列表并将所有具有相同键的值添加到该列表

例子:

List<String> valList = new ArrayList<String>();
valList.add(val1);
valList.add(val2);
mp.put(name, valList);
于 2013-01-10T17:11:19.853 回答
0

我建议看看Guava MultiMap

类似于 Map 的集合,但可以将多个值与单个键相关联。如果您使用相同的键但值不同的两次调用 put(K, V),则多重映射包含从键到两个值的映射。

否则,您将不得不对某个 Java 集合实现一个Mapof 。Strings这会起作用,但是很痛苦,因为每次输入新密钥时都必须初始化集合,如果密钥存在空集合,则将其添加到集合中。

于 2013-01-10T17:11:50.970 回答
0

您可能有一个字符串数组的映射。然后你应该检索数组列表并添加新值。

  Map<Object,ArrayList<String>> mp=new HashMap<Object, ArrayList<String>>();
于 2013-01-10T17:12:13.527 回答