簡體   English   中英

遍歷 Map 的 ArrayList 的 ArrayList

[英]Iterate over ArrayList of ArrayList of Map

我使用 SimpleExpandableListAdapter 為我的應用程序創建 ExpandableListView。 我想更好地了解如何使用列表和地圖以及它們在實踐中的作用。

 //collection for elements of a single group;
ArrayList<Map<String, String>> childDataItem;

//general collection for collections of elements
ArrayList<ArrayList<Map<String, String>>> childData;


Map<String, String> m;

我知道如何迭代 Maps 的 ArrayList,這對我來說不是問題,但我被卡住了。

childData = new ArrayList<>();
    childDataItem = new ArrayList<>();
    for (String phone : phonesHTC) {
        m = new HashMap<>();
        m.put("phoneName", phone);
        childDataItem.add(m);
    }
    childData.add(childDataItem);

    childDataItem = new ArrayList<>();
    for (String phone : phonesSams) {
        m = new HashMap<String, String>();
        m.put("phoneName", phone);
        childDataItem.add(m);
    }
    childData.add(childDataItem);

    // создаем коллекцию элементов для третьей группы
    childDataItem = new ArrayList<>();
    for (String phone : phonesLG) {
        m = new HashMap<String, String>();
        m.put("phoneName", phone);
        childDataItem.add(m);
    }
    childData.add(childDataItem);

我想記錄 childData 包含的內容( <ArrayList<Map<String, String>> ),但我不確定我做對了。 (第二個循環是 Map 迭代的簡單 ArrayList)

    for (ArrayList<Map<String, String>> outerEntry : childData) {
       for(Map<String, String> i:outerEntry ) {
           for (String key1 : i.keySet()) {
               String value1 = i.get(key1);
               Log.d("MyLogs", "(childData)value1 = " + value1);
               Log.d("MyLogs", "(childData)key = " + key1);
           }
         }


        for (Map<String, String> innerEntry : childDataItem) {
            for (String key : innerEntry.keySet()) {
                String value = innerEntry.get(key);
                Log.d("MyLogs", "(childDataItem)key = " + key);
                Log.d("MyLogs", "(childDataItem)value = " + value);
            }
        }
    }

因此,您可能知道,數組列表只是數據對象的順序存儲。 映射是鍵值對映射,其中鍵用作查找並且必須是唯一的。 也就是說,在Map您可能有許多重復的值,但只有一個鍵。

至於迭代Map您可以使用一個條目集,這使它更容易一些。 因此,如果您想遍歷<ArrayList<Map<String, String>>類型的對象,則您的 childDataItem 類看起來像這樣。

for(Map<String, String> map : childDataItem){

  //Take each map we have in the list and iterate over the keys + values
  for(Map.Entry<String, String> entry : map){
    String key = entry.getKey(), value = entry.getValue();
  }

}

在你的另一種情況下,這個例子是一樣的,除了你有另一層數組列表。

for(List<Map<String, String>> childDataItemList : childData){

  for(Map<String, String> map : childDataItemList){

    //Take each map we have in the list and iterate over the keys + values
    for(Map.Entry<String, String> entry : map){
      String key = entry.getKey(), value = entry.getValue();
    }

  }

}

如果您想記錄 childData 的所有元素,則不需要最后一個循環,您已經在第一個循環中獲取它們。 請從程序中刪除以下代碼,它將記錄 childData 的所有項目。

for (Map<String, String> innerEntry : childDataItem) {
    for (String key : innerEntry.keySet()) {
        String value = innerEntry.get(key);
        Log.d("MyLogs", "(childDataItem)key = " + key);
        Log.d("MyLogs", "(childDataItem)value = " + value);
    }
}

上面的循環迭代 childDataItem 並且您在代碼中一次又一次地使用相同的引用,因此在這種情況下,上面的循環將只包含最近的地圖項。

為簡單起見,我將您的log語句更改為sysout ,這是示例和輸出:

    ArrayList<Map<String, String>> childDataItem;
    //general collection for collections of elements
    ArrayList<ArrayList<Map<String, String>>> childData;

    Map<String, String> m;


    childData = new ArrayList<>();
    childDataItem = new ArrayList<>();
        m = new HashMap<>();
        m.put("phoneName", "HTC");
        m.put("phoneName1", "HTC1");
        childDataItem.add(m);
    childData.add(childDataItem);

    childDataItem = new ArrayList<>();
        m = new HashMap<String, String>();
        m.put("phoneName", "Samsung");
        childDataItem.add(m);
    childData.add(childDataItem);

    // создаем коллекцию элементов для третьей группы
    childDataItem = new ArrayList<>();
        m = new HashMap<String, String>();
        m.put("phoneName", "LG");
        childDataItem.add(m);
    childData.add(childDataItem);


    for (ArrayList<Map<String, String>> outerEntry : childData) {
       for(Map<String, String> i:outerEntry ) {
           for (String key1 : i.keySet()) {
               String value1 = i.get(key1);
               System.out.println("MyLogs (childData)value1 = " + value1);
               System.out.println("MyLogs (childData)key = " + key1);
           }
         }
    }

輸出

MyLogs (childData)value1 = HTC1
MyLogs (childData)key = phoneName1
MyLogs (childData)value1 = HTC
MyLogs (childData)key = phoneName
MyLogs (childData)value1 = Samsung
MyLogs (childData)key = phoneName
MyLogs (childData)value1 = LG
MyLogs (childData)key = phoneName

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM