web-dev-qa-db-ja.com

ハッシュマップからのArrayList値の保存と取得

私は次のタイプのハッシュマップを持っています

_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をポイントするにはどうすればよいですか?

map.put(string,number);行に新しい番号_18_を追加中にエラーが発生します

27
Insane Coder

私たちの変数:

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

格納するには:

_map.put("mango", new ArrayList<Integer>(Arrays.asList(0, 4, 8, 9, 12)));
_

番号を1つずつ追加するには、次のようにします。

_String key = "mango";
int number = 42;
if (map.get(key) == null) {
    map.put(key, new ArrayList<Integer>());
}
map.get(key).add(number);
_

Java 8では、putIfAbsentを使用してリストがまだ存在しない場合は追加できます。

_map.putIfAbsent(key, new ArrayList<Integer>());
map.get(key).add(number);
_

map.entrySet()メソッドを使用して繰り返し処理を行います。

_for (Entry<String, List<Integer>> ee : map.entrySet()) {
    String key = ee.getKey();
    List<Integer> values = ee.getValue();
    // TODO: Do something.
}
_
36
Simon Forsberg

このように使用できます(ただし、乱数ジェネレーターのロジックはマークに達していません)

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

編集3:あなたの要件を読んで、私はあなたがループを必要としないかもしれないと思うようになります。マップにキーmangoが含まれているかどうかだけをチェックし、18を追加する場合は、キーmangoと値18を使用してマップに新しいエントリを作成します。

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

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

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

0
juanpaolo
for (Map.Entry<String, ArrayList<Integer>> entry : map.entrySet()) {
 System.out.println( entry.getKey());     
 System.out.println( entry.getValue());//Returns the list of values
}
0
Masudul

すべてを一度に取得=

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