2012-03-11 88 views
0

如果我有一個類型的ArrayList <HashMap中<字符串,字符串>>鍵迭代/輸出到陣列

ArrayList<HashMap<String,String>> keys = functionWhichReturnsThisType(); 

如何可以通過迭代使我最終在一個HashMap的所有<第一字符串>字符串數組,並同樣將<第二個hashmap>串放入另一個字符串數組中。

我試圖使用迭代器,但數據類型的層次結構令我困惑。

appPrefs = new AppPreferences(context.getApplicationContext()); 
     ArrayList<HashMap<String,String>> keys = appPrefs.getDownloadUrls(); 
     ArrayList<String> urls = new ArrayList<String>(); 
     ArrayList<String> filenames = new ArrayList<String>(); 
     Iterator myIterator = keys.keySet().iterator(); 
     while(myIterator.hasNext()) { 
      urls.add((String)myIterator.next()); 
      filenames.add((String)keys.get(myIterator.next())); 
     } 
+1

請郵寄到現在爲止您做了什麼,我們將幫助你完成它。 – Tim 2012-03-11 06:55:32

+0

鏈接可以幫助你。[http://stackoverflow.com/questions/7683960/how-to-iterate-arraylisthashmapstring-string] – 2012-03-11 06:58:45

+0

正如你可以看到我amtring到各國財長添加在我的代碼清單,我知道如何轉換這串[]之後 – brux 2012-03-11 06:59:01

回答

2

好的,我會查看示例代碼並顯示出現問題的位置,並提示如何使其運行。

ArrayList<HashMap<String,String>> keys = appPrefs.getDownloadUrls(); 

此(上文)是細 - 但要記住keysArrayList。這是HashMap對象的列表,但它仍然是一個列表

ArrayList<String> urls = new ArrayList<String>(); 
    ArrayList<String> filenames = new ArrayList<String>(); 

這些都是很好的,但在典型的Java,這將是最好有List<String> urls = new ArrayList<String>();嘗試和使用接口,而不是具體的實現讓您的變量。

Iterator myIterator = keys.keySet().iterator(); 
    while(myIterator.hasNext()) { 

這是行不通的,因爲keysArrayList和列表沒有keySet()你想做的事:

Iterator<HashMap<String,String> listIterator = keys.iterator(); 
while(listIterator.hasNext()) { 
    HashMap<String,String> map = listIterator.next(); 
    Iterator<String> myIterator = map.keySet().iterator(); 
    while(myIterator.hasNext()) { 

,或者甚至更好是使用Java 1.5對於(每)循環:

for(Map<String,String> map : keys) { 
    for(String url : map.keySet()) { 

-

 urls.add((String)myIterator.next()); 

一旦你得到myIterator成爲地圖上的迭代器而不是列表,上面的工作就會奏效。

 filenames.add((String)keys.get(myIterator.next())); 

但是這不會有兩個原因

  1. 因爲keys仍然是一個列表。
  2. 如果你在迭代器上調用next兩次,那麼你會得到2個不同的對象。

你需要有:

 String url = myIterator.next(); 
     urls.add(url); 
     filenames.add(map.get(url)); 

或者,如果您使用的(每個)循環我上面建議的,那麼你可以跳過第一道防線。

希望有所幫助 - 如果事情還不清楚,請添加註釋。

注:solilo的解決方案是非常簡單並且是做一個好辦法,我的回答是來幫助你看到你正在運行陷入困境。

+0

這是你清除一些事情對我來說是很好的解釋,非常感謝。 – brux 2012-03-11 20:14:21

5

如果順序並不重要,你可以嘗試

for (HashMap<String, String> map : keys) { 
    urls.addAll(map.keys()); 
    filenames.addAll(map.values()); 
} 

如果你想保持這個順序,你可以嘗試

for (HashMap<String, String> map : keys) { 
    for (Map.Entry<String, String> entry : map.entrySet()) { 
     urls.add(entry.getKey()); 
     filenames.add(entry.getValue()); 
    } 
} 
1

此方法適用於您提取第一個和第二個字符串

private void getFirstAndSecondStrings(ArrayList<HashMap<String,String>> keys){ 
    ArrayList<String> firstStrings = new ArrayList<String>(); 
    ArrayList<String> secondStrings = new ArrayList<String>(); 
    for (HashMap<String, String> map : keys) { 
     Iterator iterator = map.entrySet().iterator(); 

     while (iterator.hasNext()) { 
      Map.Entry pairs = (Map.Entry)iterator.next(); 
      firstStrings.add((String)pairs.getValue()); 
      secondStrings.add((String)pairs.getKey()); 
     } 
    } 
} 
相關問題