Java ArrayList<;HashMap<;字符串,字符串>&燃气轮机;键迭代/输出到数组

Java ArrayList<;HashMap<;字符串,字符串>&燃气轮机;键迭代/输出到数组,java,android,types,Java,Android,Types,如果我有一个类型 ArrayList<HashMap<String,String>> keys = functionWhichReturnsThisType(); arraylistkeys=functionWhichReturnsThisType(); 我如何迭代,以使我最终在一个字符串数组中得到all,并同样进入另一个字符串数组 我曾尝试使用迭代器,但数据类型中的层次结构让我感到困惑 appPrefs = new AppPreferences(context.g

如果我有一个类型

ArrayList<HashMap<String,String>> keys = functionWhichReturnsThisType();
arraylistkeys=functionWhichReturnsThisType();
我如何迭代,以使我最终在一个字符串数组中得到all,并同样进入另一个字符串数组

我曾尝试使用迭代器,但数据类型中的层次结构让我感到困惑

 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()));
      }
appPrefs=新的AppPreferences(context.getApplicationContext());
ArrayList keys=appPrefs.getDownloadUrls();
ArrayList URL=新的ArrayList();
ArrayList文件名=新的ArrayList();
迭代器myIterator=keys.keySet().Iterator();
while(myIterator.hasNext()){
add((String)myIterator.next());
添加((字符串)键.get(myIterator.next());
}

如果顺序不重要,您可以试试

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());
    }
}
for(HashMap映射:键){
addAll(map.keys());
addAll(map.values());
}
如果你想维持秩序,你可以试试

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());
    }
}
for(HashMap映射:键){
对于(Map.Entry:Map.entrySet()){
add(entry.getKey());
add(entry.getValue());
}
}

此方法适用于提取第一个和第二个字符串

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());
        }
    }
}
private void GetFirstandSecondString(ArrayList键){
ArrayList FirstString=新的ArrayList();
ArrayList secondStrings=新的ArrayList();
for(HashMap:keys){
迭代器迭代器=map.entrySet().Iterator();
while(iterator.hasNext()){
Map.Entry pairs=(Map.Entry)迭代器.next();
添加((字符串)pairs.getValue());
添加((字符串)pairs.getKey());
}
}
}

好的,我将浏览您的示例代码,说明您遇到的问题,并建议如何使其正常工作

  ArrayList<HashMap<String,String>> keys = appPrefs.getDownloadUrls();
这些都很好,但在典型的Java中,最好使用
List url=new ArrayList()
尝试使用接口而不是具体实现来保存变量

  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()) {
一旦你让
myIterator
成为地图上的迭代器,而不是列表上的迭代器,上述方法就可以了

      filenames.add((String)keys.get(myIterator.next()));
但这并不是因为两个原因

  • 因为
    仍然是一个列表
  • 如果在迭代器上调用两次
    next
    ,则会得到两个不同的对象 您需要:

          String url = myIterator.next();
          urls.add(url);
          filenames.add(map.get(url));
    
    或者,如果使用我上面建议的for(each)循环,那么可以跳过第一行

    希望这能有所帮助-如果有不清楚的地方,请添加评论


    注意:
    solilo
    的解决方案简单得多,而且是一种很好的解决方法,我的答案在这里帮助您了解您遇到的麻烦。

    请发布您迄今为止所做的工作,我们将帮助您完成。链接可能会对您有所帮助。[正如您所见,我正在尝试将它们添加到我代码中的列表中,我知道如何在以后将其转换为字符串[]。这是一个非常好的解释,您为我清除了一些内容,非常感谢。
          String url = myIterator.next();
          urls.add(url);
          filenames.add(map.get(url));