2013-09-26 50 views
7

Điều tôi muốn làm là lưu trữ một số phiên bản của lớp học của tôi trên danh sách và nhận một phiên bản cụ thể từ danh sách đó.Java: Cách tốt nhất để lưu trữ và truy cập danh sách đối tượng

Đây là một ví dụ về một lớp tùy chỉnh

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 
} 

Và đây là đoạn code tôi hiện đang sử dụng để có được một trong những trường hợp trong danh sách, đó là trên các lớp học chính.

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 
} 

Câu hỏi của tôi là có cách nào khác để viết điều này để tăng hiệu suất.

+0

Tôi muốn lưu ý rằng việc đóng gói dữ liệu của bạn dường như vô nghĩa khi bạn không kiểm tra thay thế hợp lệ cho 'tên' trong phương pháp trình tắt của bạn. Bạn chỉ nên đặt 'tên' công khai để truy cập nhanh hơn. –

+2

"để truy cập nhanh hơn" là một lý do khủng khiếp để biến một lớp công khai hơn 99% thời gian. –

+0

@EricStein Đó không phải là lý do duy nhất của tôi (đọc câu tiếp theo). Nếu bạn không phiền, có lẽ bạn nên giải thích lý do tại sao 'tên' được đóng gói bởi vì thẳng thắn tôi không thấy bất kỳ điểm nào với nó. –

Trả lời

14

Sử dụng Bản đồ có khóa là tên và giá trị của nó là con người.

+2

Đánh bại tôi bằng 13 giây damn: D +1 –

+0

Nói chung, hãy sử dụng bản đồ nếu bạn định truy cập các thành viên bằng một thứ khác không phải là chỉ mục – Cruncher

+0

@albert Tôi đã cố gắng cung cấp cho bạn upvote nhưng bạn đã xóa nó – redFIVE

1

Như Eric đề cập, bạn nên sử dụng HashMap, lý do là vì bạn có thể tra cứu và thêm dữ liệu vào một cách rất nhanh (trung bình).

Dưới đây là một ví dụ mã về cách sử dụng HashMap sử dụng Person.name như chìa khóa, này giả định rằng không bao giờ là một người với cùng một tên.

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

Mã này thậm chí không biên dịch: Trước hết, bạn không được phép có các kiểu nguyên thủy khi xác định các đối số kiểu chung. Thứ hai, 'person.getName()' trả về một 'Chuỗi', không phải là' int'. Nếu là một 'int', bạn sẽ phải đặt' Integer'. –

+0

Tái cấu trúc sai, cố định. –

3

HashMap phân biệt chữ hoa chữ thường. Nếu bạn muốn tìm kiếm phân biệt chữ hoa chữ thường, bạn có thể sử dụng TreeMap. Ví dụ của tôi chứng minh rằng những người có cùng tên (phân biệt chữ hoa chữ thường) ghi đè lên nhau.

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; 
     } 
    } 
} 
Các vấn đề liên quan