2011-07-31 36 views
47

Có thể trong Java để tạo một từ điển với các mục đã được khai báo bên trong nó không? Giống như mã C# dưới đây:C# tới Java - Từ điển?

Dictionary<string, int> d = new Dictionary<string, int>() 
    { 
     {"cat", 2}, 
     {"dog", 1}, 
     {"llama", 0}, 
     {"iguana", -1} 
    }; 

Làm cách nào để làm điều này và tôi nên sử dụng loại nào? Tôi đã đọc từ điển đó đã lỗi thời.

Trả lời

68

này sẽ làm những gì bạn muốn:

Map<String,Integer> map = new HashMap<String, Integer>(){{ 
    put("cat", 2); 
    put("dog", 1); 
    put("llama", 0); 
    put("iguana", -1); 
}}; 

Lệnh này tạo một lớp con nặc danh của HashMap, nơi sự khác biệt duy nhất từ ​​lớp cha mẹ là 4 mục được thêm vào trong quá trình tạo ví dụ. Đó là một thành ngữ khá phổ biến trong thế giới Java (mặc dù một số người thấy nó gây tranh cãi vì nó tạo ra một định nghĩa lớp mới).

Bởi vì điều này gây tranh cãi, như của Java 9 có một thành ngữ mới để thuận tiện xây dựng bản đồ: gia đình của tĩnh Map.of methods.

Với Java 9 hoặc cao hơn, bạn có thể tạo ra các bản đồ mà bạn cần như sau:

Map<String, Integer> map = Map.of(
    "cat", 2, 
    "dog", 1, 
    "llama", 0, 
    "iguana", -1 
); 

Với bản đồ lớn hơn, alternative syntax này có thể ít dễ bị lỗi:

Map<String, Integer> map = Map.ofEntries(
    Map.entry("cat", 2), 
    Map.entry("dog", 1), 
    Map.entry("llama", 0), 
    Map.entry("iguana", -1) 
); 

(Điều này đặc biệt tốt đẹp nếu Map.entry được nhập tĩnh thay vì được tham chiếu một cách rõ ràng).

Bên cạnh chỉ làm việc với Java 9+, những cách tiếp cận mới là không hoàn toàn tương đương với trước đó một:

  • Họ không cho phép bạn chỉ định những gì Bản đồ thực hiện được sử dụng
  • Họ chỉ tạo bất biến bản đồ
  • Họ không tạo ra một lớp con nặc danh của Map

Tuy nhiên, những khác biệt này không phải vấn đề đối với nhiều trường hợp sử dụng, làm cho này một cách tiếp cận mặc định tốt cho các phiên bản Java mới hơn.

+0

Trên thực tế nó . Cảm ơn. – WildBamaBoy

+2

Và đây là một lời giải thích về điều này đang làm. http://techpolesen.blogspot.com/2007/08/java-initializers-add-elements-to.html –

+0

Hmmm ... cú đúp ngoặc kép thường không được coi là phong cách tốt –

12
Map<String,Integer> map = new HashMap<String, Integer>(){{ 
put("cat", 2); 
put("dog", 1); 
put("llama", 0); 
put("iguana", -1); 
}}; 
+0

Wow ai đó đã đăng này ... – fireshadow52

+0

Điều này không biên dịch, câu trả lời của bạn là chính xác trước khi bạn chỉnh sửa nó. – Affe

4

Dán dấu đầu dòng và nhập tên bản đồ!

Map<String, Integer> map = new HashMap<String, Integer>(); 
    map.put("cat", 2); 
    map.put("dog", 1); 
    map.put("llama", 0); 
    map.put("iguana", -1); 

Bạn cũng có thể làm một cái gì đó như thế này, mà có thể tiết kiệm một số thao tác với một danh sách dài:

Object[][] values = { 
     {"cat", 2}, 
     {"dog", 1}, 
     {"llama", 0}, 
     {"iguana", -1} 
    }; 

    for (Object[] o : values) { 
     map.put((String) o[0], (Integer) o[1]); 
    } 
+1

Không đời nào! Quá nhiều đánh máy. : P – WildBamaBoy

0

Java7 gần như giới thiệu "literals bộ sưu tập" mà sẽ cho phép cú pháp như thế. Họ có lẽ sẽ cố gắng để đẩy nó trong Java8. Tôi không biết có gì sai với những người này.

này có thể dễ dàng đạt được bằng một số loại API wrapper

Map<String,Integer> map = Maps.<String,Integer>empty() 
    .put("cat", 2).put("dog",1)....; 

Không quá xấu. Tôi muốn một cái gì đó giống như

map("cat", "dog", ...) 
.to( 1,  2, ...); 

Loại điều này phải được thực hiện bởi nhiều người, tiếc là API tiêu chuẩn không có những thứ như vậy.

3

Nếu bạn sử dụng Guava library, bạn có thể sử dụng lớp ImmutableMap của nó, hoặc bằng cách riêng của mình (ví dụ 1 và 2), hoặc như là một khởi tạo cho một HashMap (ví dụ 3 và 4):

Map<String, Integer> map1 = ImmutableMap.<String, Integer> builder() 
    .put("cat", 2) 
    .put("dog", 1) 
    .put("llama", 0) 
    .put("iguana", -1) 
    .build(); 
Map<String, Integer> map2 = ImmutableMap.of(
    "cat", 2, 
    "dog", 1, 
    "llama", 0, 
    "iguana", -1 
); 
Map<String, Integer> map3 = Maps.newHashMap(
    ImmutableMap.<String, Integer> builder() 
    .put("cat", 2) 
    .put("dog", 1) 
    .put("llama", 0) 
    .put("iguana", -1) 
    .build() 
); 
Map<String, Integer> map4 = Maps.newHashMap(ImmutableMap.of(
    "cat", 2, 
    "dog", 1, 
    "llama", 0, 
    "iguana", -1) 
);