如何个性化 class 的等值并测试集合中的等值?
How to personalize equals for a class and test equal values in a set?
我必须为我的火车覆盖 equals class,它具有三个属性:数量、货车和类型;只有编号相同的两列火车才相等。我必须测试我的火车 SET 中是否有重复项。我怎样才能做到这一点 ?
这是我到目前为止所做的:
public class Train {
private int number;
private String type;
private int wagons;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getWagons() {
return wagons;
}
public void setWagons(int wagons) {
this.wagons = wagons;
}
@Override
public boolean equals(Object obj) {
Train otherTrain = (Train) obj;
boolean equal = false;
if (otherTrain.getNumber() == this.getNumber()) {
equal = true;
}
return equal;
}
训练 DAO:
public class TrainsDAO {
private Set<Train> trainSet = new HashSet<Train>();
public Set<Train> pupulateTheSet() {
Random random = new Random();
for (int i = 1; i < 1000; i++) {
Train train = new Train();
train.setNumber(random.nextInt(10));
train.setWagons(random.nextInt(30));
train.setType("Inter-city");
trainSet.add(train);
}
return trainSet;
}
public static void main(String[] args) {
TrainsDAO trainsDAO = new TrainsDAO();
Set<Train> trains = trainsDAO.pupulateTheSet();
for (Train train : trains) {
System.out.println(train);
}
}
}
和测试:
public class TrainTest extends TestCase {
private TrainsDAO trainsDAO = new TrainsDAO();
private Set<Train> trainSet = trainsDAO.pupulateTheSet();
public TrainTest(String name) {
super(name);
}
@Override
protected void setUp() throws Exception {
super.setUp();
}
@Test
public void testIfThereAreEqualValuesInSet() {
assertTrue(!duplicateFound());
}
private boolean duplicateFound() {
//check if there are duplicates in the set return true if there are no false otherwise
return false;
}
}
您现在实施的 equals
覆盖可能会抛出:
NullPointerException
如果参数是 null
ClassCastException
因为在将 Object
参数转换为 Train
之前没有 instanceof
检查
您可能想要解决这个问题。
更重要的是,对于基于散列的集合,您需要 @Override
Object#hashCode
方法与 equals
一致(即,根据您的列车编号返回散列码) .
正确覆盖 hashCode
将确保您的 Train
在数字不同时将被放入不同的哈希桶中。
另请注意:让单元测试检查 Set
中的重复值似乎毫无意义 - Set
的全部意义在于它 而不是 允许重复。
文档here。
我必须为我的火车覆盖 equals class,它具有三个属性:数量、货车和类型;只有编号相同的两列火车才相等。我必须测试我的火车 SET 中是否有重复项。我怎样才能做到这一点 ? 这是我到目前为止所做的:
public class Train {
private int number;
private String type;
private int wagons;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getWagons() {
return wagons;
}
public void setWagons(int wagons) {
this.wagons = wagons;
}
@Override
public boolean equals(Object obj) {
Train otherTrain = (Train) obj;
boolean equal = false;
if (otherTrain.getNumber() == this.getNumber()) {
equal = true;
}
return equal;
}
训练 DAO:
public class TrainsDAO {
private Set<Train> trainSet = new HashSet<Train>();
public Set<Train> pupulateTheSet() {
Random random = new Random();
for (int i = 1; i < 1000; i++) {
Train train = new Train();
train.setNumber(random.nextInt(10));
train.setWagons(random.nextInt(30));
train.setType("Inter-city");
trainSet.add(train);
}
return trainSet;
}
public static void main(String[] args) {
TrainsDAO trainsDAO = new TrainsDAO();
Set<Train> trains = trainsDAO.pupulateTheSet();
for (Train train : trains) {
System.out.println(train);
}
}
}
和测试:
public class TrainTest extends TestCase {
private TrainsDAO trainsDAO = new TrainsDAO();
private Set<Train> trainSet = trainsDAO.pupulateTheSet();
public TrainTest(String name) {
super(name);
}
@Override
protected void setUp() throws Exception {
super.setUp();
}
@Test
public void testIfThereAreEqualValuesInSet() {
assertTrue(!duplicateFound());
}
private boolean duplicateFound() {
//check if there are duplicates in the set return true if there are no false otherwise
return false;
}
}
您现在实施的 equals
覆盖可能会抛出:
NullPointerException
如果参数是null
ClassCastException
因为在将Object
参数转换为Train
之前没有
instanceof
检查
您可能想要解决这个问题。
更重要的是,对于基于散列的集合,您需要 @Override
Object#hashCode
方法与 equals
一致(即,根据您的列车编号返回散列码) .
正确覆盖 hashCode
将确保您的 Train
在数字不同时将被放入不同的哈希桶中。
另请注意:让单元测试检查 Set
中的重复值似乎毫无意义 - Set
的全部意义在于它 而不是 允许重复。
文档here。