2009-05-12 34 views
38

Ai đó có thể vui lòng cung cấp ví dụ về việc tạo Java ArrayListHashMap khi đang di chuyển không? Vì vậy, thay vì thực hiện add() hoặc put(), thực sự cung cấp dữ liệu hạt giống cho mảng/băm tại lớp instantiation?Java ArrayList và HashMap on-the-fly

Để cung cấp một ví dụ, một cái gì đó tương tự như PHP ví dụ:

$array = array (3, 1, 2); 
$assoc_array = array('key' => 'value'); 
+0

Bạn có yêu cầu cho các cú pháp trên làm thế nào để làm điều đó, hoặc một ví dụ thế giới thực của lý do tại sao bạn sẽ muốn? –

Trả lời

82
List<String> list = new ArrayList<String>() { 
{ 
    add("value1"); 
    add("value2"); 
} 
}; 

Map<String,String> map = new HashMap<String,String>() { 
{ 
    put("key1", "value1"); 
    put("key2", "value2"); 
} 
}; 
+3

tạo một lớp mới mà không có bất kỳ chức năng nào khác ... –

+3

Những cách tiếp cận này là tốt. Nhưng nội dung có thể được sửa đổi sau khi tạo. Cách tiếp cận không thể thay đổi là sooooo tốt đẹp! –

+7

điều này đôi khi rất nguy hiểm. bạn sẽ nhận được một tham chiếu đến lớp bao quanh vì lớp bên trong vô danh duy trì một tham chiếu đến đối tượng cha của nó. điều này có thể gây ra vấn đề với việc thu gom rác và tuần tự hóa. –

3

Bạn có nghĩa là như thế này?

Hoặc bạn có quan tâm đến nhà xây dựng ArrayList mất Collection<? extends E> không? Ví dụ:

String[] items = new String[] { "First", "Second", "Third" }; 
// Here's one way of creating a List... 
Collection<String> itemCollection = Arrays.asList(items); 
// And here's another 
ArrayList<String> itemList = new ArrayList<String>(itemCollection); 
+0

Một chút cải thiện đối với đề nghị của Jon: làm việc cho bất kỳ số lượng mặt hàng nào: Danh sách công khai buildList (String ... items) { trả về ArrayList (Arrays.asList (items)); } –

+0

(Mã ví dụ có thể được đơn giản hóa một chút bằng cách sử dụng varags Arrays.asList(); http://stackoverflow.com/questions/258954/java-out-with-the-old-in-with-the -new/635078 # 635078) – Jonik

+0

Tôi đã hiển thị các bước riêng biệt để làm cho nó rõ ràng như thế nào để làm những việc khi bạn đã có một mảng. –

27

Một cách tốt đẹp để làm điều này là sử dụng Google Collections:

List<String> list = ImmutableList.of("A", "B", "C"); 

Map<Integer, String> map = ImmutableMap.of(
    1, "A", 
    2, "B", 
    3, "C"); 
+2

500kB là mức giá cao phải trả chỉ để thực hiện điều đó. Nếu điều duy nhất muốn là để điền vào Bộ sưu tập trên bay, câu trả lời được chấp nhận là IMHO đẹp nhất. –

+0

Một lý do khác để không thích phương pháp này là nó là một danh sách bất biến, mặc dù tôi đoán (không đọc tài liệu) rằng có một danh sách có thể thay đổi? – cgp

+0

Nó không thay đổi theo thiết kế! Nhưng có, có những lựa chọn khác nữa. Nếu nó không thay đổi, bạn có thể dễ dàng chia sẻ một thể hiện giữa các luồng và do đó giữa các yêu cầu web. 500 Kb là mức giá cao phải trả. Nhưng có rất nhiều tính năng khác trong Google Collectons, nó đáng để trả giá. –

24

Mảng có thể được chuyển đổi sang List s:

List<String> al = Arrays.asList("vote", "for", "me"); //pandering 

Lưu ý rằng điều này không không trở lại an ArrayList nhưng một trường hợp tùy ý List (trong trường hợp này, đó là Array.ArrayList)!

Cách tiếp cận của Bruno hoạt động tốt nhất và có thể được xem xét khi đang bay cho bản đồ. Tôi thích các phương pháp khác cho các danh sách mặc dù (xem ở trên):

Map<String,String> map = new HashMap<String,String>() { 
{ 
    put("key1", "value1"); 
    put("key2", "value2"); 
} 
}; 
+6

được cảnh báo, Arrays.asList không trả về java.util.ArrayList nhưng một java.util.Arrays $ ArrayList có kích thước cố định! –

7

Sử dụng một initializer nặc danh đẹp:

List<String> list = new ArrayList<String>() {{ 
    add("a"); 
    add("b"); 
}}; 

Cùng đi với một bản đồ:

Map<String, String> map = new HashMap<String, String>() {{ 
    put("a", "a"); 
    put("b", "b"); 
}}; 

Tôi tìm thấy điều này các thanh lịch và dễ đọc nhất.

Các phương pháp khác yêu cầu tạo mảng trước, sau đó chuyển đổi nó thành Danh sách - quá đắt trong sở thích của tôi và ít dễ đọc hơn.

6

cho các danh sách ngắn:

List<String> ab = Arrays.asList("a","b"); 
+2

chỉ cho danh sách kích thước cố định ... –

+0

không thực sự .. từ java.util.Arrays.java: public static Danh sách asList (T ... a) { \t trở new ArrayList (a); } để nó chỉ trả về một ArrayList –

+3

được khởi tạo trước Nhìn xa hơn trong nguồn. Mảng có lớp ArrayList bên trong của nó không hỗ trợ add() hoặc remove(). –

3

Đối với danh sách mà bạn có thể sử dụng Arrays.asList như thế này:

List<String> stringList = Arrays.asList("one", "two"); 
List<Integer> intList = Arrays.asList(1, 2); 

Đối với Maps, bạn có thể sử dụng này:

public static <K, V> Map<K, V> mapOf(Object... keyValues) { 
    Map<K, V> map = new HashMap<>(); 

    K key = null; 
    for (int index = 0; index < keyValues.length; index++) { 
     if (index % 2 == 0) { 
      key = (K)keyValues[index]; 
     } 
     else { 
      map.put(key, (V)keyValues[index]); 
     } 
    } 

    return map; 
} 

Map<Integer, String> map1 = mapOf(1, "value1", 2, "value2"); 
Map<String, String> map2 = mapOf("key1", "value1", "key2", "value2"); 

Lưu ý: trong Java 9 bạn có thể sử dụng Map.of
Note2: Double Brace Initialization để tạo HashMaps như đề xuất trong câu trả lời khác có nó caveats

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