【问题标题】:Iterate through List<Object> given from Value within a Map遍历从 Map 中的 Value 给出的 List<Object>
【发布时间】:2017-07-21 01:23:21
【问题描述】:

我对使用这样的 Java 代码比较缺乏经验。为了在我的 Selenium 自动化中取得进展,我想遍历 Map>。

现在我尝试使用以下代码接近该迭代:

static Map<String, List<WebElement>> map = new Map<String, List<WebElement>>;

for (Map.Entry<String, List<WebElement>> entry : map.entrySet()) {
    for (int i = 0; i < entry.getValue().size(); i++) {
        *need to find code*
    }
}

我的意图是遍历 map

中一个键的值内的所有 WebElement

在这种情况下,“entry.getValue().size()”会得到列表的大小吗?在这种情况下,我如何才能将某个项目从列表中删除?也许有更好的解决方案?

最好的问候

【问题讨论】:

    标签: java list dictionary iteration


    【解决方案1】:

    您可以访问每个映射条目的键和值,并执行您需要的任何操作。本例中的键是字符串,其值为List&lt;WebElement&gt;。获得列表后,您可以访问其大小并对其进行迭代。

    for (Map.Entry<String, List<WebElement>> entry : map.entrySet()) {
        String key = entry.getKey();
        List<WebElement> list = entry.getValue();
    
        // to iterate over the list, you can try
        for (int i=0; i < list.size(); ++i) {
            WebElement we = list.get(i);
            // do something with this web element
        }
    }
    

    【讨论】:

    • 由于 OP 是 Java 的新手,我认为解释您的代码可能很有用。
    • @Mistalis 添加了解释。
    • @TimBiegeleisen:非常感谢。 :) 这可能会做的工作! :)
    【解决方案2】:

    我的意图是遍历地图中一个键的值内的所有 WebElement

    这应该很容易:

    for( WebElement element : map.get(key) ) {
      //do whatever is appropriate
    }
    

    上面有一个问题:如果get(key) 返回null(键未映射或映射包含该键的值null),您将得到NullPointerException。要解决这个问题,可以先获取地图,检查是否没有获取null,然后迭代:

    List<WebElement> list = map.get(key);
    if( list != null ) {
      for( WebElement element : list ) {
        //do whatever is appropriate
      }
    }
    

    您可能还想看看 Guava 的 ListMultimap,它总是会在 get() 上返回一个集合/列表,并且可以更轻松地处理带有列表值的地图。

    在这种情况下,“entry.getValue().size()”会得到列表的大小吗?

    是的,因为 entry.getValue() 应该返回 List,除非您为给定键映射了 null。并且由于您获得了 List,因此对 size() 的调用将返回列表的大小。

    在这种情况下,我怎样才能从列表中删除某个项目?

    如果您知道该元素的索引,只需检查列表是否实际包含该索引,即是否index &gt;= 0 &amp;&amp; index &lt; list.size()。然后通过list.get(index) 获取它。

    如果您不知道索引,您需要遍历列表并检查每个元素,直到到达末尾或找到您需要的元素。或者,如果您可以按要检查的属性对列表进行排序,也可以使用二进制搜索来定位元素(如果存在)。

    但请注意,LinkedListget(index) 具有线性成本,因此不太适合通过索引或二分搜索获取,至少在列表包含许多元素时不适合。

    【讨论】:

    • 非常感谢您的解释。特别是关于空指针异常。我会考虑到这一点! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 2023-01-25
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 2019-04-06
    相关资源
    最近更新 更多