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

この最後の値のみがキーにマップされます。つまり、アナライザーはキーにマップされます。

ユーザーが入力した 1 つのキーにすべての値をマップする方法。また、各値フィールドに値を入力するようユーザーに要求する必要があります。

更新されたコード -: インストゥルメント名を要求しますが、「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

I would suggest to use

Map<Object,List<String>> mp=new HashMap<Object, List<String>>();

So that you can maintain set of values to a given key.

if a list available for given key , get the list and add the new value to list.

UPDATED

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

必要な情報ごとにフィールドを持つカスタム クラスを使用する必要があると思います。これは、名前ごとにマップに 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 に似たコレクションですが、複数の値を 1 つのキーに関連付けることができます。同じキーで異なる値を指定して put(K, V) を 2 回呼び出すと、マルチマップにはキーから両方の値へのマッピングが含まれます。

(また)

値をリストとして変更し、同じキーを持つすべての値をそのリストに追加します

例:

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 に似たコレクションですが、複数の値を 1 つのキーに関連付けることができます。同じキーで異なる値を指定して put(K, V) を 2 回呼び出すと、マルチマップにはキーから両方の値へのマッピングが含まれます。

それ以外の場合は、一部の Java コレクションMapにを実装する必要があります。Stringsそれは機能しますが、新しいキーを入力するたびにコレクションを初期化し、キ​​ーの空のコレクションが存在する場合はコレクションに追加する必要があるため、面倒です。

于 2013-01-10T17:11:50.970 に答える
0

You may have a map of string array. Then you should retrive the array list and add new value.

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