如何将字符串列表中的元素与字符串数组列表进行比较?

3

我已经将产品添加到购物篮中并在List中列出了它们的URL,并想要根据给定的String[]产品验证这些产品。

这些商品以相反的顺序存储在z String[]中,因此这里的最后一项是List中的第一项。项目数量为3,在下面的代码中,对于2个项目可以正常工作,并在第三个项目的assert方法中引发调用异常。

public void verifyBag(String[] goods) {
    actions.clickOn(By.xpath(bagLocator));
    Arrays.sort(goods);
    List<WebElement> listItems = actions.driver.findElements(By.xpath(bagItems));
    List <String> actualItems = new ArrayList<String>();
    for(int i=0;i<listItems.size();i++)
    {
        actualItems.add(listItems.get(i).getAttribute("href"));
    }
    int j = goods.length-1;
    for(int i=0;i<goods.length;i++) 
    { 

        String actualItem = actualItems.get(i);
        String product = goods[j];
        System.out.println(product);
        //assertTrue(actualItems.get(i).contains(goods[j]));
        assertTrue(actualItem.equals(product));
            j--;        
        } 
        assertEquals(listItems.size(), goods.length,"Assert Number of Items in the Bag");
    }

请在第三个项目的assert方法中抛出调用者异常,并分享抛出异常的堆栈跟踪和详细信息。 - Naman
首先,我认为在循环之前应该检查数量。其次,可以使用list.contains()方法。第三,如果你只想知道是否正确,可以将数组转换为列表,然后对两者进行排序,并使用equals()方法。 - Jai
顺便说一下,在前三行之后,你的代码可以进行优化以提高可读性,如下所示:List actualItems = listItems.stream() .map(listItem -> listItem.getAttribute("href")) .collect(Collectors.toList()); IntStream.range(0, goods.length).forEach(i -> assertEquals(goods[goods.length - i - 1], actualItems.get(i))); assertEquals(listItems.size(), goods.length, "Assert Number of Items in the Bag"); - Naman
2个回答

1
如果您不关心顺序,而是关心提供的goods列表和actualItems之间的匹配,您可以这样做:
  1. 将输入数组String[] goods转换为某个集合,例如List。让我们称其为goodsList
  2. goodsList中删除所有也在actualItems中的项目。

    • 如果结果集为空,则意味着goodsList中的所有项目也都在actualItems中。
    • 如果结果集不为空,则它将包含与goodsList相比缺失在actualItems中的项目列表。
  3. 您还可以反过来:从actualItems中删除所有也包含在goodsList中的项目。这会给您提供未在提供的列表中出现的项目列表。

代码:

public void verifyBag(String[] goods) {
    actions.clickOn(By.xpath(bagLocator));
    List<WebElement> listItems = actions.driver.findElements(By.xpath(bagItems));
    List <String> actualItems = new ArrayList<String>();
    for(int i=0;i<listItems.size();i++)
    {
        actualItems.add(listItems.get(i).getAttribute("href"));
    }
    List<String> goodsList = new ArrayList(Arrays.asList(goods));
    goodsList.removeAll(actualItems);
    if(goodsList.size() == 0) {
        // All goods from provided goods list are also in actualItems
    }
    else {
        // Some items didn't match
    }

我尝试了你的代码@Kiril,但它抛出了以下异常java.lang.UnsupportedOperationException at java.util.AbstractList.remove(AbstractList.java:161) at java.util.AbstractList$Itr.remove(AbstractList.java:374) at java.util.AbstractCollection.removeAll(AbstractCollection.java:376) at POM.NisnassProduct.verifyBag(NisnassProduct.java:72) - Karma Abdelazeez
显然,Arrays.asList存在已知问题。我更新了代码以解决它。 - timbre timbre

0
  1. 在循环之前,您必须检查 goodsactualItems 的大小。请确保数组和列表具有相同的大小,并且两者都不为 null 或为空。

  2. 函数 listItems.get(i)getAttribute("href") 可能返回 null 值,请在添加到列表之前进行检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接