复杂的Hashmap ArrayList生成器

时间:2015-05-27 20:44:19

标签: java arraylist hashmap indexof

这里有一些代码:

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

List.add("stringA");
List.add("stringB");
List.add("stringC");

for(int i = 0; i<List.size();i++){
            String key = List.get(i);
            List<String> value = new ArrayList<String>();
            map.put(key, value);
        }

此代码获取ArrayList中的任何内容,循环遍历它,将其添加到Map,然后创建一个空的ArrayList,每个字符串名称作为变量名称。现在,这是有效的,但是有一个问题,除非我忽略了一些东西。在某些时候,我将需要访问地图中新的空ArrayLists。但是,我不知道这些ArrayLists的标题是什么,没有打印出来,我不想做。基本上,我认为我需要一个map方法或类,然后是一个额外的map key方法或类。我不确定如何实现它,但可能是这样的:

public class MapKey {
public MapKey(int count, String header){

    }
}

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

我考虑的另一个选择是以某种方式循环遍历地图数组并将字符串添加到每个ArrayList,但我对地图和循环它们非常新。特别是包含ArrayLists作为其值的那些。

2 个答案:

答案 0 :(得分:1)

有多种方法可以访问HashMap的键和值:

for (Map.Entry<String,ArrayList<String>> entry : map.entrySet()) {
  String key = entry.getKey();
  ArrayList<String> value = entry.getValue();
  // do your work
}

Set<String> keys = map.keySet();
for(String key : keys){
    ArrayList<String> value = map.get(key);
}

阅读java HashMap api Java HashMap Link

修改 当你将所有元素添加到另一个元素时,你不需要循环遍历outside ArrayList对象,只需调用addAll(),它就会将一个arraylist的所有元素追加到另一个元素。

ArrayList<String> aList = map.get("stringA");

假设您的第一个外部ArrayList被称为outListOne;

aList.addAll(outListOne);

附加到相应的列表:

   //assume number of outside lists are equal to number of map elements
    String[] keysArr = {"stringA", "stringB", "stringC"};
    ArrayList[] outLists = {outListOne, outListTwo, outListThree};

    // adds outside lists to corresponding map ArrayList lists
    for(int i = 0; i < keysArr.length; i++){
        list = map.get(keysArr[i]);  // you ArrayList in a map, get it by key name
        list.addAll(outLists[i]);  // append elements from out list to corresponding list
    }

答案 1 :(得分:1)

不完全确定这些ArrayLists的标题是什么意思。&#34;但是这里有一些代码片段可能会让您更好地了解如何使用地图:

// add string x to the list for "stringA"
map.get("stringA").add(x);

// print all the values in the list for "stringC"
for (String s: map.get("stringC")) {
  System.out.println(s);
}

// print the names of the lists that contain "xyzzy"
for (String key: map.keySet()) {
  if (map.get(key).contains("xyzzy")) {
    System.out.println(key);
  }
}

// remove "foo" wherever it appears in any of the lists
for (List<String> list: map.values()) {
  while (list.remove("foo")){}
}