2013-09-26 56 views
7

我想要做的是將我的類的一些實例存儲在列表中,並從該列表中獲取特定實例。Java:存儲和訪問對象列表的最佳方法

這是一個自定義類

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

我只想指出,你的數據封裝似乎是非常沒有意義的,因爲你沒有在你的mutator方法中檢查'name'的有效替換。你應該公開'name'以加快訪問速度。 –

+2

「更快地訪問」是一個令人恐懼的原因,使得公共類超過99%的時間內公開類變量。 –

+0

@EricStein那不是我唯一的推理(閱讀前言)。如果你不介意,也許你應該解釋爲什麼'name'被封裝的原因,坦率地說,我沒有看到任何指向它。 –

回答

14

使用一個Map,其鍵是名稱,其值是人。

+2

毆打我13秒該死:D +1 –

+0

一般來說,如果您打算通過索引以外的方式訪問會員,請使用地圖 – Cruncher

+0

@albert我試圖給你一個upvote,但你刪除了它 – redFIVE

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); 
    } 
} 
+0

該代碼甚至沒有編譯:首先,當指定泛型類型參數時,不允許使用基本類型。其次,'person.getName()'返回一個'String',而不是'int'。如果是'int',則必須將'Integer'代替。 –

+0

重構出錯了,修復了。 –

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; 
     } 
    } 
}