首页 > 解决方案 > 使用 for 循环填充 ArrayList

问题描述

我创建了一个名为 City 的类的数组列表,其中只有一个城市名称的参数,方法如下:

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

我想在另一个类中通过一个文本字段填充这个arrayList,我作为一个名为name的参数传递了这个字段。我所做的是这个(注意系统输出打印是为了方便我检查输出):

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 是我没有系统输出的第一个输入。任何解决方案?提前谢谢!

标签: javaarraylist

解决方案


如果类的唯一属性是名称,那么定义一个比较名称的方法是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));
}

推荐阅读