java - 使用 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 是我没有系统输出的第一个输入。任何解决方案?提前谢谢!
解决方案
如果类的唯一属性是名称,那么定义一个比较名称的方法是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));
}
推荐阅读
- python - django 数据库连接中的操作错误
- php - 我在 cpanel 中编写此代码然后运行网站,但无法访问该网站
- javascript - 使用 JavaScript + Selenium WebDriver 进行自动化测试
- git - 如何在 Git 中的两个独立工作树之间切换分支?
- css - 这种布局是否可以仅使用 flexbox 或 bootstrap?
- excel - 针对 Excel 中的下拉列表进行多选和删除
- asp.net-mvc-4 - 如果我们在 UI 上的单列中绑定了两个单独的列值,则不会应用剑道过滤器
- c++ - 无法在结构中包含 circular_buffer
- java - 具有可配置后缀的 SpringPhysicalNamingStrategy
- graphql - GraphQL 产品查询拒绝访问