2010-09-20 3 views
5

Tôi có thể có một hashMap với ID nói là khóa và thông tin, tên, số lượng làm giá trị của tôi không?Có thể có một hashmap với 4 đối tượng không?

ok, giả sử tôi có một lớp (Sản phẩm) đã đặt biến, getters và setters của tôi. Trong lớp Invoice của tôi, đó là nơi hashMap sẽ là. Tôi sẽ đặt như:

private HashMap<String, Products> keys = new HashMap<String, Products> 

Tôi không khá chắc chắn làm thế nào để truy cập vào HashMap mặc dù. Giả sử tôi triển khai lớp cho phép tôi thêm và xóa hóa đơn khỏi HashMap, tôi không biết giá trị sẽ là gì:

keys.put(??value of id??,??not sure what goes here??); 
+0

Bạn có thể, nhưng bạn cần 2 hashmaps lồng nhau – Luxspes

+0

Xem câu trả lời của Javid Jamae về ví dụ tạo đối tượng và thêm đối tượng vào bản đồ của bạn. – ColinD

+0

sẽ trông giống như thế này? Tôi nhận được một lỗi trên các phương thức nhận được: Thông tin thông tin = new new (getID(), getName(), getInfo(), getQuantity()); – Jack

Trả lời

19

Chắc chắn. Tạo một lớp khác có chứa thông tin, tên và số lượng của bạn và đặt nó làm giá trị của HashMap của bạn.

+3

và bạn có thể muốn giữ id nếu bạn cần sau này? :) – Joset

+0

Ảnh hưởng tương tự có thể đạt được với HashMap >, và bạn không phải tạo một lớp mới – Luxspes

+5

@Luxspes: bạn có bị tính phí cho mỗi lớp bạn tạo không? –

1

Làm thế nào về HashMap<Integer, ArrayList<String>>?

CẬP NHẬT: Hãy cố gắng tránh điều này, this là cách tiếp cận tốt hơn.

+0

Tôi nghĩ rằng bạn đã nhận nó ngược, ArrayList > sẽ được viết, nhưng không phải HashMap > (vì sẽ không có cách nào để biết được các phần tử nào trong danh sách mảng là "thông tin", "tên" hoặc "số lượng" – Luxspes

+0

Nếu bạn có 4 thuộc tính của 1 ID, tại sao bạn không thể lưu theo cách đó? – zengr

+0

bởi vì sẽ không có cách nào để biết được phần tử nào trong danh sách mảng là "thông tin", "tên" hoặc "số lượng" – Luxspes

-1

Tất nhiên, bạn có thể khai báo nó như sau: HashMap<Integer, HashMap<String,Object>> Bạn sử dụng hashmap bên ngoài để liên kết id của bạn với HashMap bên trong của bạn và bên trong, bạn tạo khóa "info", "name", "quantity "và liên kết các giá trị với chúng.

Tất nhiên, bạn cũng có thể sử dụng ArrayList làm bộ sưu tập bên ngoài (có thể phù hợp hơn với ID của bạn: ArrayList<HashMap<String,Object>> theo cách bạn đã lập chỉ mục (dựa trên id) cho từng "thông tin", "tên" của bạn , "số lượng" hashmap "Hồ sơ"

+0

Như tôi đã tranh luận ở nơi khác, điều này thường không phải là ý tưởng tốt nhất. – ColinD

+0

Không phải là ý tưởng tốt nhất cho yêu cầu của bạn? hoặc không phải là ý tưởng tốt nhất từ ​​các yêu cầu của người đã đặt câu hỏi ?. Tha thứ cho tôi, nhưng tôi tin rằng bạn không phải là khách quan. – Luxspes

6

Không, nhưng cách tốt nhất là để bọc các thông tin mà bạn muốn giữ lại trong bản đồ trong một lớp học:

public class Info { 
    private String info; 
    private String name; 
    private int quantity; 

    ... 

    public Info(String info, String name, int quantity) { 
    ... 
    } 
} 

Sau đó làm điều này để đưa một cái gì đó trên bản đồ :

Info info = new Info("info", "name", 2); 
Map map = new HashMap<Integer, Info>(); 
map.put(22, info); 

Và làm điều này để có được một cái gì đó:

Info info = map.get(22) 
+0

Ảnh hưởng tương tự có thể đạt được với HashMap >, và bạn không phải tạo một lớp mới – Luxspes

+3

@Luxspes: Không. Không giống như một lớp, 'HashMap ' chỉ nói bạn "hey guys, có thể có một số chuỗi liên kết với một số đối tượng! hoặc có thể không!". Một lớp có thể cho bạn biết chính xác những trường nào CÓ, và loại của chúng là gì! Tạo một lớp học mới không phải là một vấn đề lớn. – ColinD

+0

@ColinD: Không phải là một vấn đề lớn, trừ khi bạn đang sử dụng nó để đại diện cho kết quả của truy vấn cơ sở dữ liệu có thể được người dùng tương tác xây dựng, tính linh hoạt của Bản đồ làm cho nó trở thành một giải pháp hoàn hảo. – Luxspes

-1

Bạn có thể có ID là chìa khóa và một List hoặc Set (Collection nói chung) của các đối tượng như giá trị.

0

Không chính xác.

Bản đồ xác định mối quan hệ 1 đến 1 chặt chẽ giữa các khóa và giá trị. Một khóa trong bản đồ có một giá trị.

Nếu bạn muốn kết hợp nhiều giá trị với một chìa khóa bạn cần phải làm một trong các cách sau:

  • Định nghĩa một lớp Values để đại diện cho các giá trị như một đối tượng duy nhất; ví dụ. theo câu trả lời của @ Starkey và @ Javed. Sau đó, bản đồ trở thành một Map<String, Values> (giả sử rằng loại khóa là String).

  • Xác định bản đồ dưới dạng Map<String,List<Object>> hoặc Map<String,Object[]> và đại diện cho các giá trị như một danh sách untyped/mảng

  • Xác định bản đồ dưới dạng Map<String,Properties> hoặc Map<String,Map<String,Object>> và đại diện cho các giá trị như tương đương với Java của một mảng kết hợp.

Trong số này, tùy chọn đầu tiên là an toàn nhất (cơ hội nhỏ nhất của lỗi thời gian chạy), hiệu quả nhất và phong cách tốt nhất.

(Ngoài: một commons Apache MultiMap có thể được coi như là một khả năng khác, nhưng mô hình khái niệm và API không thực sự phù hợp với sử dụng hợp cụ thể này.)

0

chắc. Tùy thuộc vào cách linh hoạt datastructe của bạn là bạn có thể sử dụng một HashMap a la:

  • HashMap<IdType, List<String>>, với IdType String hoặc Integer, tùy thuộc vào phím bạn muốn sử dụng.
  • HashMap<IdType, String[]>
  • HashMap<IdType, YourObjectType>, với YourObjectType beeing một đối tượng bạn định nghĩa chính mình, giữ các giá trị bạn muốn

YourObjectType lon dĩ nhiên là bất cứ điều gì bạn có thể định nghĩa như một Object. Ngoài ra một HashMap nếu bạn thích.

0

Một trong những mối quan tâm trong khi sử dụng Bản đồ sẽ sử dụng các khóa được mã cứng. Nếu khóa là một chuỗi và phím sẽ thay đổi. Có thể xem xét sử dụng hằng số thay vì chuỗi được mã hóa cứng.

Có một lớp chuyên dụng có lợi ích của trình biên dịch để kiểm tra các thay đổi về tên. Tuy nhiên, như đã đề cập trong các nhận xét trước đó .. Nó có thể trở thành một mối quan tâm ...

Theo tôi cả hai đều khả thi. Chúng ta cần cân nhắc lựa chọn nào tốt hơn tùy thuộc vào tình huống

0

Tạo một đối tượng bao bọc cả bốn. Một cái gì đó như:

public class Foo { 
    private String s1; 
    private String s2; 
    private int v3; 
    private MyObject obj1 
    // constructors, getters, helper functions. 
}