繁体   English   中英

数组列表 <HashMap<String,String> &gt;键迭代/输出到数组

[英]ArrayList<HashMap<String,String>> keys iteration/output to arrays

如果我有类型

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()));
      }

如果顺序无关紧要,您可以尝试

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());
    }
}

好的,我将遍历您的示例代码,并向您显示遇到问题的地方,并提出如何使它工作的建议。

  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(each)循环:

 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));

或者,如果使用上面建议的for(each)循环,则可以跳过第一行。

希望有帮助-如果不清楚,请添加评论。

注意: solilo的解决方案非常简单,并且是解决问题的一种好方法,我的回答是在这里帮助您查看遇到麻烦的地方。

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

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());
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM