使用for循环填充ArrayList

时间:2020-06-23 13:09:38

标签: java arraylist

我通过以下方式创建了一个名为City的类的arrayList,该类的唯一参数是城市名:

static ArrayList<City> citiesList = new ArrayList<City>() ;

我想在另一个类中通过一个文本字段填充此arrayList,我已将其作为参数传递给名为name的参数。我所做的是这件事(请注意系统输出是为了方便我检查输出): / p>

public void createCity(String name) {
        if(ApplicationFx.citiesList.isEmpty()) {
            ApplicationFx.citiesList.add(new City(name));
        }
        for(int i=0;i<ApplicationFx.citiesList.size();i++) {
            if(!ApplicationFx.citiesList.get(i).getCityName().equals(name)) {
                System.out.println(i +  "   " + ApplicationFx.citiesList.get(i).getCityName() + " " + name);
                ApplicationFx.citiesList.add(new City(name));
                
            }
        }
        
    }

如果按下添加城市按钮,事件处理程序将调用createCity方法,我的问题是我想检查某个名称是否已经存在,但是当我运行代码时,我在控制台中打印了以下内容:

0    CITY1    CITY2
0    CITY1    CITY3
0    CITY1    CITY4
0    CITY1    CITY5
0    CITY1    CITY6

请注意,CITY1是我的第一个输入,我没有sysout。有解决方案吗?。谢谢!!

1 个答案:

答案 0 :(得分:0)

如果City类的唯一属性是名称,则可以定义一个比较名称的equals方法:

import java.util.Objects ;

public class City {

    private final String name ;

    public City(String name) {
        this.name = name ;
    }

    public String getCityName() {
        return name ;
    }

    @Override
    public boolean equals(Object o) {
        if (o == this) return true ;
        if (! (o instanceof City)) return false ;
        return Objects.equals(((City) o).getCityName(), name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}

那么您所需要的就是

public void createCity(String name) {
    City newCity = new City(name);
    if(! ApplicationFx.citiesList.contains(newCity)) {
        ApplicationFx.citiesList.add(newCity);
    }
}

如果出于某种原因equals()方法不适用于您的课程,则可以

public void createCity(String name) {
    for (City city : ApplicationFx.citiesList) {
        if (city.getCityName().equals(name)) return ;
    }
    ApplicationFx.citiesList.add(new City(name));
}