In HashMap trong Java


129

Tôi có một HashMap:

private HashMap<TypeKey, TypeValue> example = new HashMap<TypeKey, TypeValue>();

Bây giờ tôi muốn chạy qua tất cả các giá trị và in chúng.

Tôi đã viết điều này:

for (TypeValue name : this.example.keySet()) {
    System.out.println(name);
}

Nó dường như không hoạt động.

Vấn đề là gì?

EDIT: Một câu hỏi khác: Bộ sưu tập này có dựa trên không? Ý tôi là nếu nó có 1 khóa và giá trị sẽ là 0 hoặc 1?


2
Tôi khuyên bạn nên làm quen với tài liệu của Java (nó sẽ trả lời nhiều câu hỏi của bạn). Ví dụ, đây là tài liệu hướng dẫn cho Map's size()phương pháp : ' Returns số ánh xạ giá trị khóa trong bản đồ này Nếu bản đồ chứa hơn Integer.MAX_VALUEcác yếu tố, lợi nhuận Integer.MAX_VALUE.'
Adam Paynter

Mã của bạn đang tìm kiếm Giá trị trong Khóa - không chính xác. Tìm kiếm khóa trong Khóa hoặc giá trị trong Giá trị
d-live

2
Nếu nó có 1 khóa / giá trị thì nó sẽ có kích thước 1. Nhưng điều này không liên quan gì đến việc lập chỉ mục dựa trên zero.
Jesper

Đây là một câu hỏi hay. Nhưng có một câu trả lời ở đây được cung cấp ở đây có thể thực hiện điều này trong một dòng, nếu bạn thấy giải pháp của Mingfei.
Hold OfferHunger

Câu trả lời:


140

bộ chìa khoá() chỉ trả về một bộ khóa từ hashmap của bạn, bạn nên lặp lại bộ khóa này và lấy giá trị từ hashmap bằng các khóa này.

Trong ví dụ của bạn, loại khóa của hashmap là TypeKey, nhưng bạn đã chỉ định TypeValuetrong vòng lặp for chung của mình, vì vậy nó không thể được biên dịch. Bạn nên đổi nó thành:

for (TypeKey name: example.keySet()){
            String key = name.toString();
            String value = example.get(name).toString();  
            System.out.println(key + " " + value);  
} 

Cập nhật cho Java8:

 example.entrySet().forEach(entry->{
    System.out.println(entry.getKey() + " " + entry.getValue());  
 });

Nếu bạn không yêu cầu in giá trị khóa và chỉ cần giá trị hashmap, bạn có thể sử dụng các đề xuất của người khác.

Một câu hỏi khác: Bộ sưu tập này là cơ sở không? Tôi có nghĩa là nếu nó có 1 khóa và giá trị nó sẽ là 0 hoặc 1?

Bộ sưu tập được trả về từ keySet()một Tập hợp . Bạn không thể nhận giá trị từ Tập hợp bằng cách sử dụng một chỉ mục, vì vậy vấn đề không phải là dựa trên không hay dựa trên một. Nếu hashmap của bạn có một khóa, keyset () được trả về sẽ có một mục nhập bên trong và kích thước của nó sẽ là 1.


19
Hoặc tốt hơn nữa:for (Map.Entry<String, String> entry : map.entrySet()) { ... }
Adam Paynter

2
Hoặc thậm chí gọn hơn: example.forEach((key, value) -> System.out.println("key + " | " + value));
Younes EO

93

Một cách đơn giản để xem các cặp giá trị chính:

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
System.out.println(Arrays.asList(map)); // method 1
System.out.println(Collections.singletonList(map)); // method 2

Cả phương thức 1 và phương thức 2 đều xuất ra điều này:

[{b=2, a=1}]

21
Chỉ cần làm như : System.out.println(map);, đầu ra:{b=2, a=1}
Mingfei

Vâng ... thêm một đầu ra tương tự:System.out.println(map.toString());
Ứng dụng Yo

1
@yoapps hãy cẩn thận với NPE trong trường hợp này. Đó là lý do tại sao tôi tránh .toStringkhi có thể.
Maroun

Đúng. NPE luôn ẩn nấp trong những lần cắt ngắn như vậy. Tôi chỉ muốn hiển thị một giao diện tương tự .. Tôi nghĩ đặc biệt là khi bạn gỡ lỗi cho một bản ghi / bảng điều khiển và bạn chỉ nhìn vào bản đồ có dữ liệu mà bạn biết là không có giá trị. Đây là một đám cháy nhanh chóng! Nhưng nếu mã của nó kiểm tra lại từ đầu ... thì bạn đã đúng, nó khó và trong bối cảnh lập trình tốt, nên tránh!
Ứng dụng Yo

40

Giả sử bạn có một Map<KeyType, ValueType>, bạn có thể in nó như thế này:

for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {
    System.out.println(entry.getKey()+" : "+entry.getValue());
}

16

Để in cả khóa và giá trị, sử dụng như sau:

for (Object objectName : example.keySet()) {
   System.out.println(objectName);
   System.out.println(example.get(objectName));
 }

1
Bạn đang thiếu một dấu ngoặc khác trước dấu chấm phẩy trên dòng thứ 3.
nktsamba


9

Bạn muốn tập giá trị, không phải bộ khóa:

for (TypeValue name: this.example.values()) {
        System.out.println(name);
}

Mã bạn đưa ra thậm chí sẽ không biên dịch, có thể đáng được đề cập trong các câu hỏi trong tương lai - "dường như không hoạt động" là một điều mơ hồ!


8

Đáng nói đến cách tiếp cận Java 8, sử dụng BiConsumervà các hàm lambda:

BiConsumer<TypeKey, TypeValue> consumer = (o1, o2) -> 
           System.out.println(o1 + ", " + o2);

example.forEach(consumer);

Giả sử rằng bạn đã ghi đè toStringphương thức của hai loại nếu cần.


7

Đối với tôi, một dòng đơn giản này hoạt động tốt:

Arrays.toString(map.entrySet().toArray())

6

Một câu lệnh in đơn giản với tên biến chứa tham chiếu của Hash Map sẽ làm:

HashMap<K,V> HM = new HashMap<>(); //empty
System.out.println(HM); //prints key value pairs enclosed in {}

Điều này hoạt động vì toString()phương thức đã được sử dụng quá mức trong AbstractMap classđó được mở rộng bởi HashMap Class Thông tin thêm từ tài liệu

Trả về một chuỗi đại diện của bản đồ này. Biểu diễn chuỗi bao gồm một danh sách các ánh xạ giá trị khóa theo thứ tự được trả về bởi trình lặp của bộ xem của mục nhập bản đồ, được đặt trong dấu ngoặc nhọn ("{}"). Ánh xạ liền kề được phân tách bằng các ký tự "," (dấu phẩy và dấu cách). Mỗi ánh xạ khóa-giá trị được hiển thị dưới dạng khóa được theo sau bởi dấu bằng ("=") theo sau là giá trị được liên kết. Các khóa và giá trị được chuyển đổi thành các chuỗi như String.valueOf (Object).


2
Đây có vẻ là câu trả lời tốt nhất từ ​​những người ở trên.
Karan Ahuja

5

Java 8 forEachkiểu tính năng mới

import java.util.HashMap;

public class PrintMap {
    public static void main(String[] args) {
        HashMap<String, Integer> example = new HashMap<>();
        example.put("a", 1);
        example.put("b", 2);
        example.put("c", 3);
        example.put("d", 5);

        example.forEach((key, value) -> System.out.println(key + " : " + value));

//      Output:
//      a : 1
//      b : 2
//      c : 3
//      d : 5

    }
}

4

Tôi đã làm điều đó bằng cách sử dụng Bản đồ chuỗi (nếu bạn đang làm việc với Bản đồ chuỗi).

for (Object obj : dados.entrySet()) {
    Map.Entry<String, String> entry = (Map.Entry) obj;
    System.out.print("Key: " + entry.getKey());
    System.out.println(", Value: " + entry.getValue());
}

3
map.forEach((key, value) -> System.out.println(key + " " + value));

Sử dụng các tính năng java 8


3
Mặc dù mã này có thể giải quyết câu hỏi, bao gồm giải thích về cách thức và lý do giải quyết vấn đề này thực sự sẽ giúp cải thiện chất lượng bài đăng của bạn và có thể dẫn đến nhiều lượt bình chọn hơn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, không chỉ người hỏi bây giờ. Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những hạn chế và giả định được áp dụng.
Dave

2

Hữu ích để nhanh chóng in các mục trong HashMap

System.out.println(Arrays.toString(map.entrySet().toArray()));

1

Nếu bản đồ giữ một bộ sưu tập dưới dạng giá trị, các câu trả lời khác yêu cầu nỗ lực bổ sung để chuyển đổi chúng dưới dạng chuỗi, chẳng hạn như Arrays.deepToString(value.toArray()) (nếu đó là bản đồ của các giá trị danh sách), v.v.

Tôi đã phải đối mặt với những vấn đề này khá thường xuyên và bắt gặp chức năng chung để in tất cả các đối tượng sử dụng ObjectMappers. Điều này khá tiện dụng ở tất cả các nơi, đặc biệt là trong quá trình thử nghiệm mọi thứ và tôi khuyên bạn nên chọn cách này.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public static String convertObjectAsString(Object object) {
    String s = "";
    ObjectMapper om = new ObjectMapper();
    try {
        om.enable(SerializationFeature.INDENT_OUTPUT);
        s = om.writeValueAsString(object);
    } catch (Exception e) {
        log.error("error converting object to string - " + e);
    }
    return s;
}

0

Bạn có thể sử dụng Entrylớp để đọc HashMapdễ dàng.

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.