41

次のタイプのハッシュマップがあります

HashMap<String,ArrayList<Integer>> map=new HashMap<String,ArrayList<Integer>>();    

保存される値は次のとおりです。

mango | 0,4,8,9,12
apple | 2,3
grapes| 1,7
peach | 5,6,11

Iterator を使用するか、最小限のコード行で他の方法を使用して、これらの整数を格納およびフェッチしたいのですが、どうすればよいですか?

編集1

キーが適切な行に一致するため、番号は (一緒ではなく) ランダムに追加されます。

編集2

追加中にarraylistを指すにはどうすればよいですか?

18行に新しい番号を追加しているときにエラーが発生しますmap.put(string,number);

4

8 に答える 8

2
Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
     Map.Entry pairs = (Map.Entry)it.next();

     if(pairs.getKey().equals("mango"))
     {
        map.put(pairs.getKey(), pairs.getValue().add(18));
     }

     else if(!map.containsKey("mango"))
     {
        List<Integer> ints = new ArrayList<Integer>();
        ints.add(18);
        map.put("mango",ints);
     }

     it.remove(); // avoids a ConcurrentModificationException
}

編集:これを試してみてください:

map.put(pairs.getKey(), pairs.getValue().add(number))

値に整数を入れようとしているため、エラーが発生していますが、ArrayList.

編集 2: 次に、while ループ内に次のコードを挿入します。

if(pairs.getKey().equals("mango"))
{
    map.put(pairs.getKey(), pairs.getValue().add(18));
}

else if(!map.containsKey("mango"))
{
     List<Integer> ints = new ArrayList<Integer>();
     ints.add(18);
     map.put("mango",ints);
 }

EDIT 3:あなたの要件を読むことで、ループは必要ないかもしれないと思います。マップにキーが含まれているかどうかのみを確認mangoし、追加されている場合はキーと値18を使用してマップに新しいエントリを作成することをお勧めします。mango18

したがって、必要なのはループなしの次のコードだけです。

if(map.containsKey("mango"))
{
    map.put("mango", map.get("mango).add(18));
}

else
{
    List<Integer> ints = new ArrayList<Integer>();
    ints.add(18);
    map.put("mango", ints);
}
于 2013-10-23T12:28:59.493 に答える
2

このように使用できます(乱数ジェネレーターのロジックはマークまでではありませんが)

public class WorkSheet {
    HashMap<String,ArrayList<Integer>> map = new HashMap<String,ArrayList<Integer>>();

public static void main(String args[]) {
    WorkSheet test = new WorkSheet();
    test.inputData("mango", 5);
    test.inputData("apple", 2);
    test.inputData("grapes", 2);
    test.inputData("peach", 3);
    test.displayData();

}
public void displayData(){
    for (Entry<String, ArrayList<Integer>> entry : map.entrySet()) {
        System.out.print(entry.getKey()+" | ");
        for(int fruitNo : entry.getValue()){
            System.out.print(fruitNo+" ");
        }
        System.out.println();
    }
}
public void inputData(String name ,int number) {
    Random rndData = new Random();
    ArrayList<Integer> fruit = new ArrayList<Integer>();
    for(int i=0 ; i<number ; i++){
        fruit.add(rndData.nextInt(10));
    }
    map.put(name, fruit);
}
}

出力

grapes | 7 5 
apple | 9 5 
peach | 5 5 8 
mango | 4 7 1 5 5 
于 2013-10-23T12:40:26.373 に答える
1

HashMap の代わりに MultiMap を使用してみることができます

それを初期化すると、必要なコード行が少なくなります。値を追加して取得すると、さらに短くなります。

Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();

次のようになります。

Multimap<String, Integer> multiMap = ArrayListMultimap.create();

このリンクを確認できます: http://java.dzone.com/articles/hashmap-%E2%80%93-single-key-and

于 2013-10-28T00:05:46.170 に答える
-1

一度にすべて取得する =

List<Integer> list = null;

if(map!= null) 
{ 
  list = new ArrayList<Integer>(map.values()); 
}

収納用=

if(map!= null) 
{ 
  list = map.get(keyString); 
   if(list == null)
    {
         list = new ArrayList<Integer>();
    }
  list.add(value);
  map.put(keyString,list);
}
于 2013-10-23T12:27:56.873 に答える