在arrayList中查找特定对象

时间:2014-08-01 15:23:54

标签: java list object

我有一个大的数组列表填充了一个文件(超过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
                }

但由于明显的性能原因,它无法接收。 有什么建议可以更好地做到这一点吗?

3 个答案:

答案 0 :(得分:6)

使用Map<String, City>代替List<City>,使用City#name作为地图中的关键字。如果导航顺序无关紧要,请使用HashMap作为实现,否则请使用LinkedHashMapTreeMap

答案 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)) {
}

这应该可以解决问题!

相关问题