获取数组列表中唯一的webelelements . gettext()对象的索引



我有一个ArrayList<WebElements>,它的元素都有一些文本片段。我想存储那些WebElements的索引,它们在新的ArrayList<Integer>中包含唯一的文本块。例如,如果文本是(a,b,c,a,b,d),那么我需要(1,2,3,6)。

我试着用一个stream将文本获取到ArrayList<String> piecesOfText,用另一个ArrayList<String> piecesOfTextUnique挑选唯一的文本,然后循环通过piecesOfTextUnique并通过indexOf()获得piecesOfText中那些文本的索引

ArrayList<WebElement> webElementsWithText=getWebElements();
ArrayList<String> piecesOfText= new ArrayList<>();
webElementsWithText.stream()
.map(WebElement::getText)
.forEach(piecesOfText::add);
ArrayList<String> piecesOfTextUnique = (ArrayList<String>) piecesOfText.stream()
.distinct()
.collect(Collectors.toList());
ArrayList<Integer> uniqueIndeces=new ArrayList<>();
for (int i=0;i< piecesOfTextUnique.size();i++) {
uniqueIndeces.add(piecesOfText.indexOf(piecesOfTextUnique.get(i)));
}

这个可以,但是有人能建议一个更简洁/优雅的解决方案吗?

  1. 您可以在forEach中使用collect方法代替Collection#add-ing。
  2. 你不能假设Collectors.toList返回java.util.ArrayList。可能导致ClassCastException.
  3. piecesOfTextUnique在语义上等同于piecesOfText.distinct(),因此piecesOfText可以内联。
  4. Last for循环可以替换为IntStream

所以,最终的结果是:

ArrayList<WebElement> webElementsWithText = getWebElements();
List<String> piecesOfTextUnique = webElementsWithText.stream()
.map(WebElement::getText)
.distinct()
.collect(Collectors.toList());
ArrayList<Integer> uniqueIndeces = IntStream.range(0, piecesOfTextUnique.size())
.mapToObj(i -> piecesOfTextUnique.get(i))
.map(s -> piecesOfText.indexOf(s))
.collect(Collectors.toCollection(ArrayList::new));

相关内容

  • 没有找到相关文章

最新更新