【问题标题】:ArrayList<HashMap<String,String>> keys iteration/output to arraysArrayList<HashMap<String,String>> 键迭代/输出到数组
【发布时间】:2012-03-11 06:53:46
【问题描述】:

如果我有类型

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

我怎样才能遍历,以便我最终将所有 放在一个字符串数组中,同样将 放在另一个字符串数组中。

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

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

【问题讨论】:

  • 请发布您目前所做的工作,我们将帮助您完成。
  • 链接可以帮助你。[stackoverflow.com/questions/7683960/…
  • 如您所见,我正在尝试将它们添加到我的代码中的列表中,我知道之后如何将其转换为字符串 []

标签: java android types


【解决方案1】:

如果顺序无所谓,可以试试

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

【讨论】:

    【解决方案2】:

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

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

    这(上图)很好 - 但请记住 keysArrayList。这是一个HashMap 对象的列表,但它仍然是一个列表

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

    这些都很好,但在典型的 Java 中,最好让 List&lt;String&gt; urls = new ArrayList&lt;String&gt;(); 尝试使用接口而不是具体实现来保留您的变量。

      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(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 两次,那么你会得到两个不同的对象。

    你需要:

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

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

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

    注意:solilo 的解决方案要简单得多,而且是一个很好的方法,我的回答是为了帮助您了解您遇到麻烦的地方。

    【讨论】:

    • 这是一个很好的解释,您为我解决了一些问题,非常感谢。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-02
      • 2013-07-29
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多