[英]Java: Selective comparison of two sets
我正在編寫很多單元測試,它們用不同的類來做類似的事情。
我想比較同一個類的集合。 該類指定一個id屬性。 在集合A中,此屬性均為空。 在集合B中設置此屬性。 (集合B已保存到數據庫中,並且已填充uid)。
對於我的單元測試,我想確保Set A與Set B匹配,並且我顯然不希望它查看id字段。
什么是最有效,清潔和干燥的方法?
首先,比較兩組的大小,如果不相等,則測試失敗。
對於非平凡的情況,請為集合元素定義一個java.util.Comparator
,然后根據此比較器對它們進行排序(您可以包含/省略不想進行比較的屬性)。 然后遍歷兩個集合,根據您的規則比較元素(如果我正確理解您的觀點,則不同於比較器定義的元素)。
我假設您已經正確定義了equals
和hashCode
方法,並且不想為了測試而更改它們。
您需要覆蓋類的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方法。
您可以在類中重寫equals()
和hashCode()
方法,然后使用removeAll()
方法從Set B
刪除所有元素。 張貼此,如果集合為空,則它們匹配,否則不匹配。
請注意,被覆蓋的方法應具有邏輯,該邏輯不涉及id
。
使用Java中的equals()方法可以比較重復項邏輯。
myString.equals(“比較此”);
當需要比較定制類型的對象時,必須重寫equals方法。
Student student1=new Student();
Student student2=new Student();
student1.equals(student2);
但是,當您重寫equals()方法時要小心。 您需要提供基於某些唯一ID的比較基礎。 例如,以下實現將滾動編號用作唯一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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.