首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将依赖于Iterator的方法更改为依赖于ArrayList或任何替代方法(Java)

将依赖于Iterator的方法更改为依赖于ArrayList或任何替代方法(Java)
EN

Stack Overflow用户
提问于 2020-12-17 14:54:59
回答 3查看 60关注 0票数 1

这是一个维护一个国家事故的程序的一部分,这个方法(依赖于Iterator)添加了一个意外,但是它在添加:之前检查是否存在重复。

代码语言:javascript
复制
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,所以我将它改为如下:

代码语言:javascript
复制
    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,我不是专家。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-12-17 14:57:51

这种变化显然是不正确的。

首先,我们来看一看:

代码语言:javascript
复制
for (Accident accident : it) {
  if (it.contains(accidenet)) {
    ...
  }
}

在这里,您将迭代it中的元素,因此it.contains(accident)将始终为真。

然而,你已经走上了正确的轨道。查看原始代码,特别是以下条件:

代码语言:javascript
复制
if(it.next().equals(acci)) { ... }

这表明您的元素aleady正确地使用了equals(),这意味着检查副本就像下面这样简单:

代码语言:javascript
复制
if( publishedAccidentData.contains(acci)) {
  //throw exception here
}

请注意,contains(acci)基本上与迭代和检查自己相同,例如,它或多或少是这样的:

代码语言:javascript
复制
 for( Accident accident : publishedAccidentData ) {
   if( accident.equals(acci) ) {
     //throw exception here
   }
 }

因此,使用contains()将更加简洁,而迭代自己将使您能够执行不同的检查(例如,如果equals()不符合您的需要)。

票数 0
EN

Stack Overflow用户

发布于 2020-12-17 14:58:43

这两种代码都不具有相同的功能。您使用的第二段代码中的if条件是错误的。应该是if (accident.equals(acci))

票数 0
EN

Stack Overflow用户

发布于 2020-12-17 15:32:05

实际上,您根本不需要使用循环来检查ArrayList中是否存在事故。一个if()条件就足够了

让我们假设您有两个字段(日期、位置)的意外类,那么您必须重写相等的方法来检查两个意外对象的相等性。就像下面

代码语言:javascript
复制
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对象,您可以这样做

代码语言:javascript
复制
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")
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65343075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档