嘿,我在比较两个列表时遇到麻烦。目标是比较两个列表,找到相同的值,然后将这些值存储到第三个列表中。到目前为止,我发现的只是返回布尔值的方法,而没有返回列表值的方法。有什么想法吗?
这是我从数据库获取值的两种方法:
data <- read.csv("D:/df.csv", stringsAsFactors = F)[which(read.csv("D:/df.csv", stringsAsFactors = F)$Column_name == "rowValue_to_stop"),]
答案 0 :(得分:3)
您可以编写一条给出所需结果的SQL语句来代替在代码中进行处理
SELECT
BROJ_POLICE
FROM
ins2.kalk_cpi AS a
INNER JOIN
ins_RAZNO.ADND_DATOTEKA AS b
ON
a.BROJ_POLICE = b.BROJ_POLICE
这样,您就可以浪费更少的内存来获取仅包含一些公共值的两个可能庞大的列表。
// QUERY = query from above, omitted for readability
List<BrojPolice> list = jdbcTemplate.query(QUERY, new Object[0],
(rs,rowNum) -> {
BrojPolice bp = new BrojPolice();
bp.setBroj(rs.getString("BROJ_POLICE"));
return bp;
});
如何在Java中做到这一点:
List<A> a = list1();
List<A> b = list2();
// A has to implement equals and hashCode
List<A> result = new ArrayList<A>();
for (A element : a) {
if (b.contains(element)) // this requires a proper equals implementations
result.add(element);
}
return result;
请注意,在这种情况下,进行list1.contains(list2)
总是false
,因为contains
会检查元素是否包含。
答案 1 :(得分:1)
您可以将List.retainAll
用作:
List<BrojPolice> common = new ArrayList<>(dohvatiBrojPolice());
common.retainAll(dohvatiBrojPolice2());
这将要求BrojPolice
与适当的hashCode
和equals
具有可比性。
如果您正在为此寻找流或forEach解决方案
List<BrojPolice> common = dohvatiBrojPolice().stream()
.filter(a -> dohvatiBrojPolice2().contains(a))
.collect(Collectors.toList());
答案 2 :(得分:1)
首先,您的BrojPolice类需要实现hashCode和equals方法,以便包含的方法可以按预期工作。然后尝试以下方法:
public List<BrojPolice> intersection(List< BrojPolice > list1, List<BrojPolice> list2) {
List<BrojPolice> intersection = new ArrayList<BrojPolice>();
for (BrojPolice bp : list1) {
if(list2.contains(bp)) {
list.add(bp);
}
}
return intersection;
}