当前位置: 首页 > 知识库问答 >
问题:

三个数组列表的公共部分

唐修明
2023-03-14

我有一个带有@RequestParam(required = false)的控制器,该控制器必须返回带有一些过滤器的所有药物(如果它们存在),该控制器的服务包含它的逻辑,但它不工作。主要的问题是,我有3个数组列表,但我无法找到所有三个数组列表中的所有元素:)

    public List<Medicine> readAllMedicine(Double lessThenPrice, Double moreThenPrice, String name) {
    //when lessThenPrice < moreThenPrice, result of their queries will not have general elements
    if ((lessThenPrice != null && moreThenPrice != 0) && lessThenPrice < moreThenPrice) {
        return Collections.emptyList();
    }

    List<Medicine> resultList = new ArrayList<>();
    List<Medicine> lessList = new ArrayList<>();
    List<Medicine> moreList = new ArrayList<>();
    List<Medicine> nameList = new ArrayList<>();

    //checking if there are arguments from the controller
    if (lessThenPrice != null) {
        lessList.addAll(medicineDao.findMedicinesByPriceIsLessThan(lessThenPrice));
    }
    if (moreThenPrice != null) {
        moreList.addAll(medicineDao.findMedicinesByPriceIsGreaterThan(moreThenPrice));
    }
    if (name != null) {
        nameList.addAll(medicineDao.findMedicinesByName(name));
    }

    //saving general elements
    //this part is not working
    if (!lessList.isEmpty() || !moreList.isEmpty() || !nameList.isEmpty()) {
        List<Medicine> temp = new ArrayList<>(); //it will contain general part of lessList and moreList
        for (Medicine medicine : lessList) {
            if (moreList.contains(medicine)) {
                temp.add(medicine);
            }
        }
        for (Medicine medicine : nameList) {
            if (temp.contains(medicine)) {
                resultList.add(medicine);
            }
        }
        return resultList;
    }
    //if there is no args, just return all medicines
    return medicineDao.findAll();
}

共有3个答案

陈朗
2023-03-14

最好的方法是使用retainAll方法,从列表中删除所有不常见的项目。https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#retainAll(java.util.Collection

曹建明
2023-03-14

从多个列表中获取所有公共元素的一个选项是迭代第一个列表,过滤掉所有其他列表中存在的元素,所以:

List<Medicine> resultList = lessList.stream()
        .filter(moreList::contains)
        .filter(namesList::contains)
        .collect(Collectors.toList());

虽然这种方法可行,但是在列表较大的情况下,为了获得更好的性能,您可以考虑使用< code>HashSets来代替列表。

此外,此代码假定 Medicine 类具有相等哈希代码的正确实现。

艾意蕴
2023-03-14

集合#retainAll() 方法将仅保留出现在另一个集合中的项目;换句话说,就是两个集合的交集。使用它两次可获取三个集合的交集:

List<String> list1 = List.of("a", "b", "c", "q");
List<String> list2 = List.of("b", "d", "e", "q");
List<String> list3 = List.of("b", "q", "r", "s");
List<String> intersection = new ArrayList<String>(list1);
intersection.retainAll(list2);
intersection.retainAll(list3);
System.out.println(intersection); // [b, q]
 类似资料:
  • 问题内容: 如何以简洁明了的方式找出两个列表中的第一个公共元素(在本例中为“ 2”)?任何列表都可以为空,也可以没有公共元素-在这种情况下,没有一个很好。 我需要它来向新手展示python,所以越简单越好。 UPD:顺序对于我的目的并不重要,但让我们假设我正在寻找x中的第一个元素,该元素也出现在y中。 问题答案: 这应该很简单 几乎和它一样有效 (要获得更有效的解决方案,请检查Ashwini Ch

  • 我有三张桌子: 我想从表1中选择COL1,从表2中选择COL5,从表3中选择COL4 它喜欢两个联接表,但是当我使用以下查询时,它不起作用,COL5是空白的。 请帮忙。 PS我复制了之前的一个类似示例,但输出不同。

  • 我一直在尝试通过使用apache commons file upload over JBOSS 5.1解析一个多部分请求。问题是当解析请求时,文件项列表没有被填充。(FileItem列表为空)以下是在windows上工作但在Unix上不工作的代码块: 注意:我通过HttpEvent到达HTTPServletRequest。getHTTPServletRequest()。此外,以前也没有处理过该请求

  • 问题内容: 我有两个数组: 我如何获得这两个数组中的常见项目列表 我无法使用,因为我想比较2个数组。 问题答案: 您还可以结合使用和: 我们考虑以下代码片段: 我用short和long s(10到100 s)(全部随机生成)做了一些(人工)基准测试。我总是用 我得到以下结果: 如果您不只转换为a,则更可取 结果说明 使用该方法使用“蛮力”搜索,该搜索具有时间复杂度 ,而与该方法相反。然而从转换到和

  • 有人请让我知道我如何才能达到预期的结果。如有任何帮助,不胜感激。 谢谢

  • 在私有类中创建一个全局List并具有getter和setter方法会更好,还是只公开它会更好?Java的标准是什么? 我被教导将变量设为私有,只有getter和setter方法,但是访问公共列表肯定比私有列表更好。 这是我的观点,但我当然更喜欢按照标准去做,而不是按照看起来好的去做。