将集合中的新元素与另一个集合中的旧元素进行比较-Java

时间:2018-12-16 03:09:56

标签: 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);
      }
    }
  }

这很好用,但我相信可以用更好的方法简化它。任何建议做得更好!

2 个答案:

答案 0 :(得分:0)

您正在使用两个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());
    }
}

如您所见,您可以询问两种不同类型的对象是否相等(在这种情况下,不需要覆盖{{1} }。

现在,您应该可以进行剩下的工作了(关于您最初关于两个Set的问题)

答案 1 :(得分:0)

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;

    }
  }
}
相关问题