私は次のタイプのハッシュマップを持っています
_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
_を追加中にエラーが発生します
私たちの変数:
_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.
}
_
このように使用できます(ただし、乱数ジェネレーターのロジックはマークに達していません)
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
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);
}
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
for (Map.Entry<String, ArrayList<Integer>> entry : map.entrySet()) {
System.out.println( entry.getKey());
System.out.println( entry.getValue());//Returns the list of values
}
すべてを一度に取得=
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);
}