我有两个数组列表。每个都有User类型的对象列表。
User类如下所示
public class User {
private long id;
private String empCode;
private String firstname;
private String lastname;
private String email;
public User( String firstname, String lastname, String empCode, String email) {
super();
this.empCode = empCode;
this.firstname = firstname;
this.lastname = lastname;
this.email = email;
}
// getters and setters
}
import java.util.ArrayList;
import java.util.List;
public class FindSimilarUsersWithAtLeastOneDifferentProperty {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<User> list1 = new ArrayList<User>();
list1.add(new User("F11", "L1", "EMP01", "u1@test.com"));
list1.add(new User("F2", "L2", "EMP02", "u222@test.com"));
list1.add(new User("F3", "L3", "EMP03", "u3@test.com"));
list1.add(new User("F4", "L4", "EMP04", "u4@test.com"));
list1.add(new User("F5", "L5", "EMP05", "u5@test.com"));
list1.add(new User("F9", "L9", "EMP09", "u9@test.com"));
list1.add(new User("F10", "L10", "EMP10", "u10@test.com"));
List<User> list2 = new ArrayList<User>();
list2.add(new User("F1", "L1", "EMP01", "u1@test.com"));
list2.add(new User("F2", "L2", "EMP02", "u2@test.com"));
list2.add(new User("F6", "L6", "EMP06", "u6@test.com"));
list2.add(new User("F7", "L7", "EMP07", "u7@test.com"));
list2.add(new User("F8", "L8", "EMP08", "u8@test.com"));
list2.add(new User("F9", "L9", "EMP09", "u9@test.com"));
list2.add(new User("F100", "L100", "EMP10", "u100@test.com"));
List<User> resultList = new ArrayList<User>();
// this list should contain following users
// EMP01 (common in both list but differs in firstname)
// EMP02 (common in both list but differs in email)
// EMP10 (common in both list but differs in firstname, lastname and email)
}
}
如果您看到示例代码,则这两个列表有四个用户,其代码为EMP01,EMP02,EMP09和EMP10。
因此,我们只需要比较这四个用户的属性。
如果任何用户至少有一个不同的属性,则应将其添加到结果列表中。
请告知我该如何解决这个问题?
答案 0 :(得分:6)
在User
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (!(obj instanceof User))
return false;
User u = (User) obj;
return this.empCode == null ? false : this.empCode
.equals(u.empCode);
}
@Override
public int hashCode() {
return this.empCode == null ? 0 : this.empCode.hashCode();
}
@Override
public String toString() {
return "Emp Code: " + this.empCode;
}
然后使用retainAll
list2.retainAll(list1);-->EMP01, EMP02, EMP09, EMP10
答案 1 :(得分:3)
我认为你应该做的 -
for(User user1 : list1) {
for(User user2 : list2) {
if(user1.getEmpCode().equals(user2.getEmpCode())) {
if(!user1.getFirstName().equals(user2.getFirstName()) ||
!user1.getLastName().equals(user2.getLastName()) ||
!user1.getEmail().equals(user2.getEmail())) {
resultList.add(user1);
}
}
}
}
User
覆盖equal
和hashCode
仅用于此目的可能没有意义。它们应该以域内更有意义的方式被覆盖。
答案 2 :(得分:2)
规范方法如下:
countDifferences
,计算用户之间的差异数量如果你在不同的属性上加权,你也可以控制它,例如ID属性中的匹配强于名称中的匹配。
更新:抱歉,误读了ID属性必须匹配的评论。
将2)替换为“查找具有相同ID的对象”。除此之外,我仍然建议计算差异的数量。它更灵活,因为您可以定义好的或坏匹配的阈值等。
答案 3 :(得分:2)
将此方法添加到您的User类:
public boolean isSimilarButNotEqual(User other) {
if(!this.empCode.equals(other.empCode))
return false;
return !(this.firstname + this.lastname + this.email).equals(other.firstname + other.lastname + other.email);
}
然后,在main()
做:
for(User user1: list1){
for(User user2: list2){
if(user1.isSimilarButNotEqual(user2)){
resultList.add(user1);
resultList.add(user2);
}
}
}
答案 4 :(得分:1)
这很简单。覆盖equal
课程中的User
方法。一个非常简单的实现(您可以通过使用null检查等来增强它)如下所示:
@override
public boolean equals(Object obj) {
User other = (User) obj;
if(this.id==other.id
&& this.empCode.equals(other.empCode)
&& this.firstname.equals(other.firstname)
&& this.lastname.equals(other.lastname)
&& this.email.equals(other.email)){
return true;
}else{
return false;
}
}
完成后,您可以使用:
for(user user: list1){
if(!resultList.contains(user)){
resultList.add(user);
}
}
for(user user: list2){
if(!resultList.contains(user)){
resultList.add(user);
}
}
答案 5 :(得分:0)
我使用以下方法比较两个自定义ArrayList
。
List<SinglePostData> allPosts = new ArrayList<>();
List<SinglePostData> noRepeatAllPosts = new ArrayList<>();
for (int i = 0; i < allPosts.size(); i++) {
boolean isFound = false;
for (int j = i+1; j < allPosts.size(); j++) {
if (allPosts.get(i).getTitle().equals(allPosts.get(j).getTitle())) {
isFound = true;
break;
}
}
if (!isFound) noRepeatAllPosts.add(allPosts.get(i));
}