簡體   English   中英

Java:兩組的選擇性比較

[英]Java: Selective comparison of two sets

我正在編寫很多單元測試,它們用不同的類來做類似的事情。

我想比較同一個類的集合。 該類指定一個id屬性。 在集合A中,此屬性均為空。 在集合B中設置此屬性。 (集合B已保存到數據庫中,並且已填充uid)。

對於我的單元測試,我想確保Set A與Set B匹配,並且我顯然不希望它查看id字段。

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

首先,比較兩組的大小,如果不相等,則測試失敗。

對於非平凡的情況,請為集合元素定義一個java.util.Comparator ,然后根據此比較器對它們進行排序(您可以包含/省略不想進行比較的屬性)。 然后遍歷兩個集合,根據您的規則比較元素(如果我正確理解您的觀點,則不同於比較器定義的元素)。

我假設您已經正確定義了equalshashCode方法,並且不想為了測試而更改它們。

您需要覆蓋類的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM