2012-03-11 3 views
0

Если я иметь типArrayList клавиши <HashMap <String, String >> итерация/вывод в массивы

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

Как я могу перебирать, так что я в конечном итоге со всеми < 1 строка HashMap> в string array, а также < Вторая строка 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

+0

Ссылка может помочь вам. [Http://stackoverflow.com/questions/7683960/how-to-iterate-arraylisthashmapstring-string] –

+0

Как вы можете видеть, я хочу добавить их в список в моем коде, я знаю, как конвертировать это для строки [] впоследствии – brux

ответ

2

ОК, я буду пройдите по образцу кода и покажите, где вы столкнулись с проблемами, и предложите, как вы можете заставить его работать.

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

Это (выше) прекрасно - но помните keys является ArrayList. Это список 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()) { 

Это не будет работать, потому что keys является ArrayList, и список не имеет 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())); 

Но это не будет по 2 причинам

  1. Поскольку keys еще список.
  2. Если вы вызываете next на итераторе дважды, вы получаете 2 разных объекта.

Вы должны иметь:

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

Или, если вы используете для (каждый) цикл я предложил выше, то вы можете пропустить эту первую строку.

Надеюсь, что это поможет - если что-то неясно, добавьте комментарий.

Примечание: Решениеsolilo намного проще и является хорошим способом сделать это, и я отвечу здесь, чтобы помочь вам увидеть, с чем вы столкнулись.

+0

Это очень хорошее объяснение, которое вы прояснили для меня несколько вещей, спасибо большое. – brux

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()); 
     } 
    } 
} 
Смежные вопросы