将所有值映射到一个键

时间:2013-01-10 17:10:07

标签: java maps

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

5 个答案:

答案 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>>();