Java 比较第三个列表中存储的两个列表和相同的值

Java 比较第三个列表中存储的两个列表和相同的值,java,arraylist,Java,Arraylist,Hy,我在比较两个列表时遇到了麻烦。目标是比较两个列表,找到相同的值并将这些值存储到第三个列表中。到目前为止,我发现的只是返回布尔值的方法,而没有返回列表值的方法。。有什么想法吗 以下是我从数据库获取值的两种方法: @Override public List<BrojPolice> dohvatiBrojPolice() { List<BrojPolice> filter = jdbcTemplate.query("SELECT*FROM ins2.kalk_cp

Hy,我在比较两个列表时遇到了麻烦。目标是比较两个列表,找到相同的值并将这些值存储到第三个列表中。到目前为止,我发现的只是返回布尔值的方法,而没有返回列表值的方法。。有什么想法吗

以下是我从数据库获取值的两种方法:

@Override
public List<BrojPolice> dohvatiBrojPolice() {
    List<BrojPolice> filter = jdbcTemplate.query("SELECT*FROM ins2.kalk_cpi;",new Object[]{},
            (rs,rowNum) ->{
                BrojPolice bp = new BrojPolice();
                bp.setBroj(rs.getString("BROJ_POLICE"));
                return bp;
            });
    return filter;
}


@Override
public List<BrojPolice> dohvatiBrojPolice2() {
    List<BrojPolice> filter2 = jdbcTemplate.query("SELECT*FROM ins_RAZNO.ADND_DATOTEKA;",new Object[]{},
            (rs,rowNum) ->{
                BrojPolice bp = new BrojPolice();
                bp.setBroj(rs.getString("BROJ_POLICE"));
                return bp;
            });
    return filter2;
}

public List<String> brojPolice(){
    boolean match = dohvatiBrojPolice().contains(dohvatiBrojPolice2());

     //ideas?

    return //List
}
@覆盖
公共列表dohvatiBrojPolice(){
List filter=jdbcTemplate.query(“SELECT*FROM ins2.kalk_cpi;”,新对象[]{},
(rs,rowNum)->{
BrojPolice bp=新BrojPolice();
bp.setBroj(rs.getString(“BROJ_POLICE”);
返回bp;
});
回流过滤器;
}
@凌驾
公共列表dohvatiBrojPolice2(){
List filter2=jdbcTemplate.query(“从ins_RAZNO.ADND_DATOTEKA;中选择*”,新对象[]{},
(rs,rowNum)->{
BrojPolice bp=新BrojPolice();
bp.setBroj(rs.getString(“BROJ_POLICE”);
返回bp;
});
回流过滤器2;
}
公共列表brojPolice(){
布尔匹配=dohvatiBrojPolice()。包含(dohvatiBrojPolice2());
//想法?
返回//列表
}
您可以将其用作:


首先,您的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;
}
公共列表交叉点(列表list1,列表list2){
列表交点=新的ArrayList();
对于(BrojPolice bp:list1){
如果(列表2.contains(bp)){
列表。添加(bp);
}
}
折返交叉口;
}

您可以编写一条SQL语句,给出所需的结果,而不是在代码中处理此问题

选择
布罗丘警察局
从…起
ins2.kalk_消费物价指数作为
内连接
作为b级,在拉兹诺和达托特卡
在…上
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;
    });
//QUERY=上面的查询,为便于阅读而省略
List List=jdbcTemplate.query(查询,新对象[0],
(rs,rowNum)->{
BrojPolice bp=新BrojPolice();
bp.setBroj(rs.getString(“BROJ_POLICE”);
返回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;
List a=list1();
列表b=list2();
//A必须实现equals和hashCode
列表结果=新建ArrayList();
对于(A元素:A){
if(b.contains(element))//这需要一个适当的equals实现
结果:添加(元素);
}
返回结果;

请注意,在这种情况下,执行
list1.contains(list2)
将始终是
false
,因为
contains
检查元素是否包含。

这将有助于实现可能的重复。最好的方法是编写一个返回准确结果的SQL查询。除@nullpointer的答案外,您还应该为BrojPolice类实现一个“equals”方法,以使您的对象具有可比性有没有任何方法可以通过使用forEach来实现?@ZoranBajcer有,我已经更新了答案,但是如果使用内置API可以完成某些事情,您应该坚持使用它。旁白:然后,您的方法也可能具有返回类型
List.
// 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;
    });
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;