Helpex - Trao đổi & giúp đỡ Đăng nhập
84

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?

84 hữu ích 4 bình luận 294k xem chia sẻ
14 trả lời 14
94

keyset () 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);  
} 

Nếu bạn không yêu cầu in giá trị khóa và chỉ cần giá trị băm, 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 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.

94 hữu ích 1 bình luận chia sẻ
70

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}]
70 hữu ích 2 bình luận chia sẻ
36

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());
}
36 hữu ích 0 bình luận chia sẻ
13

Bạn có một vài lựa chọn

13 hữu ích 0 bình luận chia sẻ
13

Để 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));
 }
13 hữu ích 1 bình luận chia sẻ
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ồ!

9 hữu ích 0 bình luận chia sẻ
7

Đá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 hữu ích 0 bình luận chia sẻ
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());
}
4 hữu ích 0 bình luận chia sẻ
3

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).

3 hữu ích 1 bình luận chia sẻ
2

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

    }
}
2 hữu ích 0 bình luận chia sẻ
2

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

Arrays.toString(map.entrySet().toArray())
2 hữu ích 0 bình luận chia sẻ
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;
}
1 hữu ích 0 bình luận chia 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
}
0 hữu ích 0 bình luận chia sẻ
0

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

System.out.println(Arrays.toString(map.entrySet().toArray()));
0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ java collections , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading