Java将所有列表(值)复制到新列表中Map <integer,list <string =“”>&gt; </integer,>

时间:2014-12-09 17:07:33

标签: java list dictionary data-structures

Maps存在问题。 假设我们有以下代码:

public class HashMaps {
  public static void main(String[] ar){
    List<String> list = new ArrayList<>();
    Map<Integer, List<String>> myMap = new HashMap<>();
    list.add("one");
    list.add("two");
    list.add("three");
    list.add("four");
    List cloneList = ((List) ((ArrayList) list).clone());
    myMap.put(0, cloneList);
    list.clear();
    list.add("un");
    list.add("deux");
    list.add("trois");
    list.add("quatre");
    cloneList = ((List) ((ArrayList) list).clone());
    myMap.put(1, cloneList);
    System.out.println("map : "+myMap);
    System.out.println("keys : "+myMap.keySet());
    System.out.println("values : "+myMap.values());
  }
}

我怎样才能获得List<String>的所有新值Lists {(1}})?

基本上,我有以下列表:

myMap

想得到:

["one"]
["two"]
["three"]
["four"]

2 个答案:

答案 0 :(得分:2)

根据您的编辑,您似乎想要在地图中获取每个单独的列表并将它们合并到一个列表中:

List<String> combined = new ArrayList<String>();
for(List<String> list : myMap.values()) {
    combined.addAll(list);
}
// combined holds all lists into a single list

编辑(根据您的评论问题)

如果您只想添加某些列表,而不是所有列表,以及您决定哪些列表是Map中列表的索引,那么您可以这样做。

Collection返回的myMap.values()转换为List,然后使用list.get(index)方法在允许的索引处添加所有值。

List<String> selectedLists = new ArrayList<String>();
int[] allowedIndexes = {0, 1, 2, 3};                                          // only lists at indexes 0, 1, 2 and 3 are inserted into combined list
List<List<String>> listOfLists = new ArrayList<List<String>>(myMap.values()); // convert Collection to List
for(int i = 0; i < allowedIndexes.length; i++) {                              // if allowed index is within the bounds of the amount of lists, add the list at that index to selected lists
    int index = allowedIndexes[i];
    if(index < listOfLists.size()) {
        selectedLists.addAll(listOfLists.get(index));
    }
}
// selectedLists now contains only lists from the allowed indexes

另一种方法是创建一个允许索引数组并迭代映射中的所有值,只添加对应于允许索引的值。

要确定当前索引是否被允许,您可以创建一个辅助方法来迭代所有允许的索引,并检查当前索引是否作为允许索引存在。

帮助方法:

// check if element exists in the array
boolean isInArray(int[] array, int element) {
    for(int i = 0; i < array.length; i++) {
        if(array[i] == element) {
            return true;
        }
    }
    return false;
}

解决方案:

List<String> selectedLists = new ArrayList<String>();
int[] allowedIndexes = {0, 1, 2, 3};       // only lists at indexes 0, 1, 2 and 3 are inserted into combined list
int index = 0;                             // current index counter
for(List<String> list: myMap.values()) {   // iterate over all existing lists
    if(isInArray(allowedIndexes, index)) { // if the list at current index is allowed, add it to the selected lists
        selectedLists.addAll(list);
    }
    index++;                               // update the index
}
// selectedLists now contains only lists from the allowed indexes

一种可以改进辅助方法的方法,假设你保持排序的允许索引数组,是使用Binary Search检查是否存在索引,这会使搜索时间减少一个对数因子: / p>

boolean isInArrayImproved(int[] array, int element) {
    if(Arrays.binarySearch(array, element) >= 0) {
        return true;
    }
    return false;
}

答案 1 :(得分:-2)

虽然我个人不推荐,但您只需Override toString方法。

黑客攻击是这样的:

List<String> list = new ArrayList<String>(){

@Override
 public String toString(){
  String s="";
  for(String string : this){
    s= s + "\""+ string "\"\n";
  }
  return s;
 }
};

正如人们所提到的,更好的方法是iterate通过每个元素并打印出来。