我有一个大的数组列表填充了一个文件(超过50000行),我需要在这个列表中找到一个特定的对象
我的对象类
public class City{
public City() {
super();
}
private String name;
private String department;
public String getName() {
return name;
}
public void setName(String name) {
this.nom = name;
}
public String getDepartment() {
return deparement;
}
public void setDepartment(String department) {
this.department = department;
}
@Override
public String toString() {
return name;
}
}
解决方案正在进行
List<City> listCity = ParseFile.parseCityFile(this);
String item = textView.getText().toString();
for (City c : listCity ) {
if(c.getName().equals(item))
// stuff here
}
但由于明显的性能原因,它无法接收。 有什么建议可以更好地做到这一点吗?
答案 0 :(得分:6)
使用Map<String, City>
代替List<City>
,使用City#name
作为地图中的关键字。如果导航顺序无关紧要,请使用HashMap
作为实现,否则请使用LinkedHashMap
或TreeMap
。
答案 1 :(得分:2)
在您的班级City
覆盖equals()
,hashCode()
和Comparable
-
@Override
public boolean equals(Object b) {
if (b != null) {
if (this == b) return true;
return this.getName().equals(((City) b).getName());
}
return false;
}
@Override
public int hashCode() {
return this.getName().hashCode();
}
@Override
public int compareTo(City o) {
return this.getName().compareTo(o);
}
然后你可以使用
if (listCity.contains(item)) {
}
然后,为了快速查找,您可以使用地图或TreeSet
。 TreeSet(根据Javadoc),
此实现为基本操作(添加,删除和包含)提供有保证的log(n)时间成本。
答案 2 :(得分:1)
我使用equals()方法(将其添加到您的City类):
public boolean equals(Object object) {
boolean areEquals = false;
if (object instanceof City) {
City otherCity = (City) object;
areEquals = (this.getName() == otherCity.getName() && this.getDepartment() == otherCity.getDepartment());
}
return areEquals;
}
我还会通过以下方式替换你的if条件:
if (listCity.contains(item)) {
}
这应该可以解决问题!