从两个列表中<Object>删除重复项



扩展到学生班的班级学校

package sample.compareTwoObject;
import java.util.Objects;
public class SchoolObj extends Students
{
private String name;
private String school;

public SchoolObj(String nameStr, String schoolStr,String StdName,String rollNo)
{
super(StdName ,rollNo);
this.setName(nameStr);
this.setSchool(schoolStr);
}
public String getName()
{
return this.name;
}
public void setName(String name)
{
this.name = name;
}
public String getSchool()
{
return this.school;
}
public void setSchool(String school)
{
this.school = school;
}
@Override
public String toString()
{
return this.getName() + ' ' + this.getSchool();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SchoolObj schoolObj = (SchoolObj) o;
return name.equals(schoolObj.name) && school.equals(schoolObj.school);
}
@Override
public int hashCode() {
return Objects.hash(name, school);
}
}

班级学生

package sample.compareTwoObject;
import java.util.Objects;
public class Students {
private String name;
private String rollNo;
public Students(String name, String rollNo) {
this.name = name;
this.rollNo = rollNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRollNo() {
return rollNo;
}
public void setRollNo(String rollNo) {
this.rollNo = rollNo;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Students students = (Students) o;
return name.equals(students.name) && rollNo.equals(students.rollNo);
}
@Override
public int hashCode() {
return Objects.hash(name, rollNo);
}
}

在这里,我试图合并两个列表,删除重复的数据

package sample.compareTwoObject;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamTest
{
public static void main(String[] args)
{
List<SchoolObj> listOne = new ArrayList<SchoolObj>();
// TODO: Add sample data to listOne.
listOne.add(new SchoolObj("nameA", "schoolX","Ramesh","24"));
listOne.add(new SchoolObj("nameC", "schoolZ","Aman","24"));
List<SchoolObj> listTwo = new ArrayList<SchoolObj>();
// TODO: Add sample data to listTwo.
listTwo.add(new SchoolObj("nameA", "schoolX","kk","24"));
listTwo.add(new SchoolObj("nameB", "schoolY","Raj","24"));

// Print results from stream method.
System.out.println("Results from stream concat method:");
List<SchoolObj> resultsViaConcatStream = StreamTest.createConcatListViaStream(listOne, listTwo);
for (SchoolObj obj : resultsViaConcatStream)
{
System.out.println(obj);
}
}

public static List<SchoolObj> createConcatListViaStream(List<SchoolObj> listOne, List<SchoolObj> listTwo)
{
List<SchoolObj> listOneList = null;
if(!listOne.containsAll(listTwo)) {
listOneList = Stream.concat(listOne.stream(),listTwo.stream()).distinct().collect(Collectors.toList());

}
return listOneList;
}
}

我期待得到:

Results from stream concat method:
Size: 3
nameA schoolX
nameC schoolZ
nameA schoolX
nameB schoolY

但我得到了:

Results from stream concat method:
Size: 3
nameA schoolX
nameC schoolZ
nameB schoolY

为什么它忽略new SchoolObj("nameA", "schoolX","kk","24")

当比较相等时,您的SchoolObj只考虑字段nameschool,因此createConcatListViaStream中的distinct将在这两个字段匹配的地方删除重复项。

如果您希望Students中的代码/规则也适用,则必须调用super.equals()并在equals比较中使用该值,或者显式比较其他字段。

此外:从逻辑上讲,School班扩展Student没有多大意义:从任何理智的意义上讲,学校都不是一种学生。一所学校可能有一份学生名单,或者一名学生可能被分配到某所学校,但他们不应该相互延伸。

这是因为Student和School的equals方法它只比较name和rollNo

// School
name.equals(schoolObj.name) && school.equals(schoolObj.school);
// Student
name.equals(students.name) && rollNo.equals(students.rollNo)

根据这个比较,下面的记录有相同的名称和rollNo,所以在最终结果中只剩下一个

listOne.add(new SchoolObj("nameA", "schoolX","Ramesh","24"));
listTwo.add(new SchoolObj("nameA", "schoolX","kk","24"));

相关内容

最新更新