这是一个维护一个国家事故的程序的一部分,这个方法(依赖于Iterator)添加了一个意外,但是它在添加:之前检查是否存在重复。
public void addAcci(Accident acci) throws DupliactionException {
DateFormat dateft = new SimpleDateFormat("dd/mm/yyyy");
Iterator<Accident> it = this.publishedAccident.iterator(); //start from here //P.S:publishedAccident is an ArrayList
while (it.hasNext()) {
if (it.next().equals(acci)) {
throw new DupliactionException("Accident duplication at:\n"
+ "Duplication Reason:- Duplication in date " + dateft.format(acci.getAccidentDateAndTime()));
}
}
this.publishedAccidentData.add(acci);
}--我不希望这个方法依赖于Iterator,所以我将它改为如下:
public void addAcci(Accident acci) throws DupliactionException {
DateFormat dateft = new SimpleDateFormat("dd/mm/yyyy");
ArrayList<Accident> it = this.publishedAccidentData;
for (Accident accident : it) {
if (it.contains(accidenet)) {
throw new DupliactionException("Accident duplication at:\n"
+ "Duplication Reason:- Duplication in date " + dateFormat.format(acci.getAccidentDateAndTime()));
}
}
this.publishedAccidentData.add(accidenet);
}所以,这个变化是正确的,是否做同样的事情?如果没有,请提供最简单的答案,因为我正在学习Java,我不是专家。
发布于 2020-12-17 14:57:51
这种变化显然是不正确的。
首先,我们来看一看:
for (Accident accident : it) {
if (it.contains(accidenet)) {
...
}
}在这里,您将迭代it中的元素,因此it.contains(accident)将始终为真。
然而,你已经走上了正确的轨道。查看原始代码,特别是以下条件:
if(it.next().equals(acci)) { ... }这表明您的元素aleady正确地使用了equals(),这意味着检查副本就像下面这样简单:
if( publishedAccidentData.contains(acci)) {
//throw exception here
}请注意,contains(acci)基本上与迭代和检查自己相同,例如,它或多或少是这样的:
for( Accident accident : publishedAccidentData ) {
if( accident.equals(acci) ) {
//throw exception here
}
}因此,使用contains()将更加简洁,而迭代自己将使您能够执行不同的检查(例如,如果equals()不符合您的需要)。
发布于 2020-12-17 14:58:43
这两种代码都不具有相同的功能。您使用的第二段代码中的if条件是错误的。应该是if (accident.equals(acci))
发布于 2020-12-17 15:32:05
实际上,您根本不需要使用循环来检查ArrayList中是否存在事故。一个if()条件就足够了
让我们假设您有两个字段(日期、位置)的意外类,那么您必须重写相等的方法来检查两个意外对象的相等性。就像下面
class Accident {
String date;
String place;
public Accident(String date, String place) {
this.date = date;
this.place = place;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Accident accident = (Accident) o;
return Objects.equals(date, accident.date) &&
Objects.equals(place, accident.place);
}
@Override
public int hashCode() {
return Objects.hash(date, place);
}}
您有一个意外事件的ArrayList,其中包含a1,a2意外类对象,如果您想检查ArrayList中的一个新的a3对象,您可以这样做
ArrayList<Accident> list = new ArrayList();
Accident a1 = new Accident("11/11/2011", "USA");
Accident a2 = new Accident("11/11/2012", "UK");
list.add(a1);
list.add(a2);
Accident a3 = new Accident("11/11/2011", "USA");
if (list.contains(a3)) {
System.out.println("Already existed")
}https://stackoverflow.com/questions/65343075
复制相似问题