7

我想要做的是将我的类的一些实例存储在一个列表中,并从该列表中获取一个特定的实例。

这是自定义类的示例

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
}

我的问题是是否有任何其他方法可以写这个来提高性能。

4

3 回答 3

14

使用一个 Map,其键是名称,值是人。

于 2013-09-26T19:44:23.240 回答
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;
        }
    }
}
于 2013-09-26T19:59:43.077 回答
1

正如 Eric 提到的,您应该使用 a HashMap,原因是您可以非常快速地(平均而言)查找并向其中添加数据。

这是一个如何使用HashMapusingPerson.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);
    }
}
于 2013-09-26T19:50:08.480 回答