Java:两组的选择性比较

时间:2013-04-10 10:41:17

标签: java comparison set

我正在编写很多单元测试,它们使用不同的类来执行类似的操作。

我想比较同一类的集合。该类指定id属性。在集合A中,此属性全为空。在Set B中,此属性已设置。 (已将B集持久保存到数据库并已填充uid)。

对于我的单元测试,我想确保Set A与Set B匹配,我显然不希望它看到id字段。

最有效,干净和干燥的方法是什么?

4 个答案:

答案 0 :(得分:1)

首先,比较两组的大小,如果它们不相等,则测试失败。

对于非平凡的情况,请为设置元素定义java.util.Comparator,根据此比较器对两者进行排序(您可以包含/省略您不想比较的属性)。然后迭代两个集合,根据你的规则比较元素(不同于比较器定义的元素,如果我理解你的观点)。

我假设您已经正确定义了equalshashCode方法,并且不希望为了测试而更改它们。

答案 1 :(得分:0)

你需要覆盖类的hashCode()和equals()方法,你不应该在方法中包含id字段,然后equals方法Set将按照你想要的方式工作。

例如,

class  Test{

int id;
String name;
String other;
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    result = prime * result + ((other == null) ? 0 : other.hashCode());
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Test other = (Test) obj;
    if (name == null) {
        if (other.name != null)
            return false;
    } else if (!name.equals(other.name))
        return false;
    if (this.other == null) {
        if (other.other != null)
            return false;
    } else if (!this.other.equals(other.other))
        return false;
    return true;
}

}

现在,Test类对象不依赖于ID。您可以使用像Eclipse这样的IDE轻松生成equlas和hashCode方法。

答案 2 :(得分:0)

您可以覆盖equals()&您的类中使用hashCode()方法,然后使用removeAll()方法从Set B中删除所有元素。发布这个,如果集合为空,那么它们匹配,否则它们不匹配。

请注意,重写的方法应该具有逻辑,不涉及id

答案 3 :(得分:0)

使用 equals()方法在Java中实现重复项逻辑的比较。

  

myString.equals(“比较这个”);

当您需要比较您的客户类型的对象时,您必须覆盖equals方法。

Student student1=new Student();
Student student2=new Student();
student1.equals(student2);

但是当你重写equals()方法时要小心。您需要根据一些独特的ID提供一些比较基础。例如,以下实现使用Roll编号作为唯一ID进行比较

public class Student {

  private int rollNo;
  private String name;
  private String address;


    // Getters and Setters

@Override
  public int hashCode() {
   // Overide this only when you use Hashing implementations
  }

  @Override
  public boolean equals(Object obj) {
    if (obj == null) {
      System.out.println("Not Equal due to NULL");
      return false;
    }
    if (this == obj) {
      System.out.println("Equals due to same reference");
      return true;
    }
    if (getClass() != obj.getClass()) {
      System.out.println("Different Type");
      return false;
    }
    Student other = (Student) obj;
    if (rollNo == other.rollNo) {
      System.out.println("RollNo " + rollNo + " EQUALS " + other.rollNo);
      return true;
    }
    if (rollNo != other.rollNo) {
      System.out.println("RollNo " + rollNo + " NOT EQUALS " + other.rollNo);
      return false;
    }
    System.out.println("Default is FALSE");
    return false;
  }

}