2012-02-13 42 views
8

Tôi phải hoàn thành một kịch bản lạ kỳ lạ. Mô tả của nó như sau:Bản đồ với nhiều loại giá trị trong java

Tôi phải thiết kế Bản đồ nơi 'Phím' luôn là loại Chuỗi. Tuy nhiên, 'Giá trị' cho một trong các khóa có thể là một chuỗi hoặc Danh sách (phụ thuộc vào số lượng giá trị mà một khóa cụ thể có thể có. 'Value' sẽ là Chuỗi nếu khóa cụ thể đó chỉ có một giá trị và nó phải là Danh sách nếu khóa chứa nhiều giá trị). Làm thế nào để hoàn thành kịch bản này?

Ví dụ: có 2 khóa trong bản đồ là "Tên" và "Số điện thoại". Một người chỉ có thể có một tên và nhiều số điện thoại. Vì vậy, ở đây khóa đầu tiên tức là "Tên" phải có loại 'Chuỗi' cho Giá trị, trong khi đối với khóa thứ hai, tức là "Số điện thoại" phải có loại 'Danh sách' cho Giá trị. Làm thế nào để khai báo một Map như vậy. Có thể không?

+0

Bài tập về nhà tương tự như sau: http://stackoverflow.com/questions/9259997/in-java-how-can-i-work-with-objects-which-can-be-either-string-or -liststring ??? –

Trả lời

13

Có thể làm điều gì đó như Map<String, Object>.

Nhưng: Tôi thực sự khuyên bạn nên suy nghĩ về thiết kế của mình. Bạn nên sử dụng một lớp học cho người của bạn để thay thế. Bằng cách đó, bạn có thể thực hiện: Map<String, Person> với Person có getters và setters cho tên, số điện thoại và thông tin khác.

Ví dụ Person lớp:

public class Person { 

    private String name; 
    private List<String> phoneNumbers = Collections.emptyList(); 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setPhoneNumbers(List<String> phoneNumbers) { 
     this.phoneNumbers = phoneNumbers; 
    } 

    public void addPhoneNumber(String number) { 
     phoneNumbers.add(number); 
    } 

    public List<String> getPhoneNumbers() { 
     return phoneNumbers; 
    } 
} 
0

Tại sao không làm một lớp PhoneNumber wrapper đó cho thấy nhiều một API cho soring một hoặc điện thoại multipel số và sau đó có thể lấy một hoặc tất cả (nhiều) số điện thoại và sau đó làm một bản đồ của String và PhoneNumber? Một cái gì đó như:

class PhoneNumber { 


    private String[] phoneNumbers; 


    public void storePhoneNumber(String... phoneNumbers) { 
    this.phoneNumbers = phoneNumbers; 
    } 

    public String getPhoneNumber() { 
    if(phoneNumbers.length>=1) { 
     return phoneNumbers[0]; 
    } else { 
     return null; 
    } 

    } 

    public List<String> getPhoneNumbers() { 
    if(phoneNumbers!=null) { 
     return Arrays.asList(phoneNumbers); 
    } else { 
     return null; 
    } 

    } 

}

2

Tất nhiên có. Chọn chất độc của bạn:

Map<String, Object> mixed = new HashMap<String, Object>(); 

Map<String, Serializable> mixed = new HashMap<String, Serializable>(); 

@SuppressWarnings("rawtypes") 
Map mixed = new HashMap(); 
1

Vâng, tại sao không tạo Map<String, List<String>>? bạn có thể luôn luôn chỉ cần thêm một yếu tố vào danh sách của bạn nếu có chỉ là một giá trị hoặc sử dụng một supertype chung của String và Danh sách, do đó bạn sẽ nhận được

Map<String, Object> 
+0

Người dùng yêu cầu cách sử dụng cấu trúc này: '" Tên "->" Sam Something "," Phone Nos "->" 1234 "," 5678 "' vẫn không hoạt động với ví dụ của bạn. – nfechner

+2

'ListMultimap' của ổi là một bộ sưu tập tốt hơn để sử dụng thay vì' Bản đồ > ' –

+0

@nfechner: tại sao nó không hoạt động?đối tượng có thể được bất cứ điều gì có thể được đại diện trong java, hoặc am i thiếu một cái gì đó ở đây? – bvanvelsen

1

tôi sẽ làm một trong các cách sau:

  1. Sử dụng Multimap<String, String>. Multimap sẽ chứa một hoặc nhiều giá trị được liên kết với mỗi khóa.

  2. Sử dụng Map<String, Either<String, List<String>>>. Sử dụng một số Either để phân biệt giữa một hoặc nhiều giá trị.

Các vấn đề liên quan