[英]Compare new elements in set with old elements in another set - Java
我有一Set
具有现有值的对象Set
,并获取了一个新的Set
值作为更新。 如果新Set
确实包含旧对象,则我什么也不做;如果新Set
包含新对象,则我要发送创建更新;如果新Set
不包含现有对象,则我要发送删除更新。
对象有两个字段:
private PreferenceType preferenceType;
private String preferenceValue;
目前,我正在将现有Set对象与新Set对象进行比较,如果我在新集合中找不到任何现有对象,则发送删除更新。
private void sendDeletePreferenceMessage(Set<AccountPreference> existingAccountPreferences, Set<AccountPreference> accountPreferencesFromRequest) {
int counter = 0;
for(AccountPreference accountPreference : existingAccountPreferences) {
for(AccountPreference accountPreference1: accountPreferencesFromRequest) {
if(accountPreference.getPreferenceType().equals(accountPreference1.getPreferenceType()) &&
accountPreference.getPreferenceValue().equals(accountPreference1.getPreferenceValue()))
counter++;
}
if(counter == 0) {
accPrefDeleteSender.send(accountPreference);
}
}
}
还将新对象集与现有对象集进行比较,以查找要作为创建更新发送的新更新
private void sendCreatePreferenceMessage(Set<AccountPreference> accountPreferencesFromRequest, Set<AccountPreference> existingAccountPreferences) {
int counter = 0;
for(AccountPreference accountPreference : accountPreferencesFromRequest) {
for(AccountPreference accountPreference1: existingAccountPreferences) {
if(accountPreference.getPreferenceType().equals(accountPreference1.getPreferenceType()) &&
accountPreference.getPreferenceValue().equals(accountPreference1.getPreferenceValue()))
counter++;
}
if(counter == 0) {
accPrefCreateSender.send(accountPreference);
}
}
}
这很完美,但是我相信可以用更好的方法简化它。 任何建议做得更好!
您正在使用两个AccountPreference
对象:一个带有id字段,另一个没有id。 我不知道是否可以不使用接口或抽象类。 不过,根据您的评论,在我看来,您对如何重写Object.equals
方法感到困惑,因此,我举一个例子:
class MyObjectWithId {
private long id;
private String someField;
public String getSomeField() {
return someField;
}
@Override
public boolean equals(Object other){
if (this == other) return true;
if (other == null || !other.getClass().isInstance(MyObject.class)) return false;
MyObject myObject = (MyObject) other;
return this.getSomeField().equals(myObject.getSomeField());
}
}
class MyObject {
private String someField;
public String getSomeField() {
return someField;
}
@Override
public boolean equals(Object other){
if (this == other) return true;
if (other == null || !other.getClass().isInstance(MyObjectWithId.class)) return false;
MyObjectWithId myObjectWithId = (MyObjectWithId) other;
return this.getSomeField().equals(myObjectWithId.getSomeField());
}
}
如您所见,您可以询问两种不同类型的Object是否相等(在这种情况下,不需要重写hashCode
)。
现在,您应该可以完成其余工作了(关于您最初关于两个Set的问题)
Set有一个boolean contains(Object o)
。
您不需要两个for
循环,只需遍历一个Set
并检查另一个Set
contains()
对象。
您还需要重写POJO中的boolean equals(Object o)
!
class MyObject {
private PreferenceType preferenceType;
private String preferenceValue;
@Override
public boolean equals(Object o){
if (this == o)
return true;
if (o == null || o.getClass()o.getClass() != getClass())
return false;
if(this.getPreferenceType().equals(o.getPreferenceType()) && this.getPreferenceValue().equals(o.getPreferenceValue()))
return true;
return false;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.