我有一个带有@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();
}
最好的方法是使用retainAll方法,从列表中删除所有不常见的项目。https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#retainAll(java.util.Collection)
从多个列表中获取所有公共元素的一个选项是迭代第一个列表,过滤掉所有其他列表中存在的元素,所以:
List<Medicine> resultList = lessList.stream()
.filter(moreList::contains)
.filter(namesList::contains)
.collect(Collectors.toList());
虽然这种方法可行,但是在列表较大的情况下,为了获得更好的性能,您可以考虑使用< code>HashSets来代替列表。
此外,此代码假定 Medicine
类具有相等
和哈希代码
的正确实现。
集合#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方法,但是访问公共列表肯定比私有列表更好。 这是我的观点,但我当然更喜欢按照标准去做,而不是按照看起来好的去做。