我想要做的是将我班级的一些实例存储在列表中,并从该列表中获取特定实例。
这是自定义类的示例
public class Person
{
private String name;
//Several unrelevant fields here
public Person(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
//Several unrelevant methods here
}
这是我正在使用的代码,用于获取列表中的一个实例,即主类上的实例。
public class Main
{
private List<Person> people = new ArrayList<Person>();
//More unrelevant fields here
public Person getPerson(String name)
{
for (Person p : people)
if (p.getName().equalsIgnoreCase(name))
return p;
return null;
}
//More unrelevant methods here
}
我的问题是,是否还有其他方法可以写这个以提高性能。
答案 0 :(得分:14)
使用一个地图,其键是名称,其值是人。
答案 1 :(得分:3)
HashMap区分大小写。如果您想要不区分大小写的查找,可以使用TreeMap。我的例子表明,具有相同名称(不区分大小写)的人会相互覆盖。
import java.util.Map;
import java.util.TreeMap;
public class SoMain {
Map<String, Person> nameToPersonMap =
new TreeMap<String, Person>(String.CASE_INSENSITIVE_ORDER);
public static void main(String[] args) {
new SoMain().run(args);
}
private void run(String[] args) {
addPerson(new Person("Jim McDonald", 1));
addPerson(new Person("Jim Mcdonald", 2));
addPerson(new Person("John Smith", 3));
System.out.println("Number of people: "
+ nameToPersonMap.entrySet().size());
System.out.println("Jim McDonald id: "
+ getPerson("Jim McDonald").getPersonId());
System.out.println("John Smith id: "
+ getPerson("john smith").getPersonId());
}
private void addPerson(Person p) {
nameToPersonMap.put(p.getName(), p);
}
private Person getPerson(String name) {
return nameToPersonMap.get(name);
}
public static class Person {
private String name;
private int personId;
public Person(String name, int personId) {
this.name = name;
this.personId = personId;
}
public int getPersonId() {
return personId;
}
public String getName() {
return name;
}
}
}
答案 2 :(得分:1)
正如Eric提到的那样,你应该使用HashMap
,这样做的原因是你可以很快(平均)查找和添加数据。
以下是如何使用HashMap
作为关键字使用Person.name
的代码示例,这假设从未有过具有相同名称的人。
public class Main
{
private HashMap<String, Person> people = new HashMap<String, Person>();
public void addPerson(Person person)
{
people.put(person.getName(), person);
}
public Person getPerson(String name)
{
// get returns null when not found
return people.get(name);
}
}