【问题标题】:Iterating for loop for list of strings and storing element value为字符串列表迭代for循环并存储元素值
【发布时间】:2017-04-20 18:43:21
【问题描述】:

我有一个hashmap,它有一个我在for loop. 中交互的键列表 在我的 Hashmap 中,我有一个键 FURNITURE_NAMES 和值为 Table,Chair,Board. 现在我希望将 FURNITURE_NAMES 的键中存在的值存储在列表中。

下面是我做的代码:

当我得到密钥 FURNITURE_NAMES 时,我有以下值

FURNITURE_NAMES = "桌、椅、板"

for(Map.Entry<String, List<String>> entry : furnitureMap.entrySet()) 
{
String furnitureKey = entry.getKey();
for(String key : entry.getValue() )
    {   
    if(furnitureKey!=null && furnitureKey.equalsIgnoreCase("FURNITURE_NAMES"))
        {                           
            furnitureList = new ArrayList<String>();
            String a = new String();
            a=key;
            furnitureList.add(a);                                                       
        }
    }
}

当我迭代 Hashmap 得到键 FURNITURE_NAMES 我得到第一个值 "Table" 该值存储在列表中。 其次我得到chair。 它覆盖了值表,我在列表中仍然只有 1 个值,即 chair

我也尝试通过索引将值放入列表中,但它引发了 indexoutofboundsexception。我如何拥有列表中的所有值而不是被新值覆盖。任何帮助。

【问题讨论】:

    标签: java loops arraylist iterator


    【解决方案1】:

    在每次迭代中,您都会创建一个列表的新实例,如下所示:

    furnitureList = new ArrayList<String>();
    

    您必须在 for 之前或其他地方创建此列表,并将其保留如下:

    furnitureList = new ArrayList<String>();
    for(Map.Entry<String, List<String>> entry : furnitureMap.entrySet()) {
    // same code here except the list initialization
    }
    

    另外,您不需要为每个值创建一个新字符串。只需将它作为 for 循环中的 value 变量(错误地命名为 key :) )放入列表中。如果我们重构你的代码,它看起来像:

    furnitureList = new ArrayList<String>();
    for(Map.Entry<String, List<String>> entry : furnitureMap.entrySet()) {
        if(entry.getKey() != null && entry.getKey().equalsIgnoreCase("FURNITURE_NAMES")) {
            furnitureList.addAll(entry.getValue());
        }
    }
    

    【讨论】:

    • 还有一个addAll() 方法,可以添加列表中的所有元素。这可以替换内部的 for 循环。
    • @TurbutAlin List 类型中的方法 addAll(Collection extends String>) 不适用于参数 (String) 当我试图做 addAll
    • 您是在entry.getValue()entry.getKey() 上做addAll 吗?
    • 在 entry.getValue 上。但是,当我尝试 snofty 的解决方案时,它工作正常。我想实施您的解决方案,因为您的票数最高。
    • @NitheshKumar 使用 add all 无疑比同时添加一个值更好。发现问题有点复杂,因为我不知道你做了什么,但你应该确保类型匹配。
    【解决方案2】:

    对于您正在进行的每次迭代

    furnitureList = new ArrayList<String>();
    

    正在重新初始化您的列表。

    将其移至您的第一个 for 循环之前

    例如

    furnitureList = new ArrayList<String>();
    for(Map.Entry<String, List<String>> entry : furnitureMap.entrySet()) 
    

    【讨论】:

      【解决方案3】:

      应该是,list应该在迭代map值(即list)之前创建,并且不需要创建字符串a,可以直接添加到list或者你觉得克隆尝试String newKey=new String(key);

      furnitureList = new ArrayList<String>();
      for(Map.Entry<String, List<String>> entry : furnitureMap.entrySet()) 
      {
         String furnitureKey = entry.getKey();
      
         for(String key : entry.getValue() )
          {
             if(furnitureKey!=null && furnitureKey.equalsIgnoreCase("FURNITURE_NAMES"))
              {                   
                furnitureList.add(key);                                                       
              }
          }
      }
      

      【讨论】:

      • 如果HashMap 中有另一个键,将重新创建列表,从而删除值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      相关资源
      最近更新 更多