2012-06-13 29 views
12

Làm thế nào tôi có thể đổ các nội dung của một HashMap Java (hoặc bất kỳ khác), ví dụ để STDOUT?Làm cách nào để kết xuất nội dung của bản đồ băm?

Như một ví dụ, giả sử rằng tôi có một HashMap phức tạp của cấu trúc sau:

(student1 => Map(name => Tim,   
        Scores => Map(math => 10, 
            physics => 20, 
            Computers => 30), 
        place => Miami, 
        ranking => Array(2,8,1,13), 
       ), 
student2 => Map ( 
        ............... 
        ............... 
       ), 
............................ 
............................ 
); 

Vì vậy, tôi muốn in nó ra màn hình để có được một ý tưởng về cấu trúc dữ liệu. Tôi đang tìm một cái gì đó tương tự như var_dump của PHP() hoặc Dumper của Perl().

+0

Bạn đã thử 'toString()' chưa? –

Trả lời

20

Sử dụng HashMap.toString() (docs here):

System.out.println("HASH MAP DUMP: " + myHashMap.toString()); 

Nói chung, sử dụng Object.toString() để đổ dữ liệu như thế này.

+0

Nó hoạt động tốt ngoại trừ mảng. Xem bản in tại đây, '{list_mem = {validate_data = {tên = STRING, địa điểm = DONT_KNOW}, func = getMemList, elems = [I @ 973678}}'. Ở đây 'elems' là một mảng và các giá trị của nó không được in. –

0

Tôi thường sử dụng chức năng như thế này (nó có thể cần phải được mở rộng để chứa prety-print của các loại đối tượng bên trong Bản đồ).

@SuppressWarnings("unchecked") 
private static String hashPP(final Map<String,Object> m, String... offset) { 
    String retval = ""; 
    String delta = offset.length == 0 ? "" : offset[0]; 
    for(Map.Entry<String, Object> e : m.entrySet()) { 
     retval += delta + "["+e.getKey() + "] -> "; 
     Object value = e.getValue(); 
     if(value instanceof Map) { 
      retval += "(Hash)\n" + hashPP((Map<String,Object>)value, delta + " "); 
     } else if(value instanceof List) { 
      retval += "{"; 
      for(Object element : (List)value) { 
       retval += element+", "; 
      } 
      retval += "}\n"; 
     } else { 
      retval += "["+value.toString()+"]\n"; 
     } 
    } 
    return retval+"\n"; 
} // end of hashPP(...) 

Như vậy mã sau

public static void main(String[] cmd) { 
    Map<String,Object> document = new HashMap<String, Object>(); 

    Map<String,Object> student1 = new LinkedHashMap<String, Object>(); 
    document.put("student1", student1); 
    student1.put("name", "Bob the Student"); 
    student1.put("place", "Basement"); 
    List<Integer> ranking = new LinkedList<Integer>(); 
    student1.put("ranking", ranking); 
    ranking.add(2); 
    ranking.add(8); 
    ranking.add(1); 
    ranking.add(13); 
    Map<String,Object> scores1 = new HashMap<String, Object>(); 
    student1.put("Scores", scores1); 
    scores1.put("math", "0"); 
    scores1.put("business", "100"); 

    Map<String,Object> student2= new LinkedHashMap<String, Object>(); 
    document.put("student2", student2); 
    student2.put("name", "Ivan the Terrible"); 
    student2.put("place", "Dungeon"); 

    System.out.println(hashPP(document)); 
} 

sẽ sản xuất sản lượng

[student2] -> (Hash) 
    [name] -> [Ivan the Terrible] 
    [place] -> [Dungeon] 

[student1] -> (Hash) 
    [name] -> [Bob the Student] 
    [place] -> [Basement] 
    [ranking] -> {2, 8, 1, 13, } 
    [Scores] -> (Hash) 
    [math] -> [0] 
    [business] -> [100] 

Again. Bạn có thể cần phải sửa đổi điều này cho các nhu cầu cụ thể của bạn.

+0

Chắc chắn sử dụng 'StringBuilder' thay vì nối. Ngoài ra, điểm của 'offset' là varargs là gì? Và sự kết hợp của các thông số kiểu chung tùy ý, loại thô và phôi không an toàn? –

+0

1) Nếu một trong những sử dụng chức năng này để gỡ lỗi thường xuyên sau đó sử dụng chuỗi nối không làm cho bất kỳ sự khác biệt. 2) Có biến bù như biến số tôi tránh tạo hàm băm khác (Bản đồ <,> m) {return hashPP (m, ""); } – Dmitri

+0

Ngoài ra, vì tôi sử dụng chức năng này để gỡ lỗi bản in, tôi biết rằng hầu hết mã khóa của tôi thường là một chuỗi và giá trị là một số đối tượng chung hoặc một hashmap có tính chất tương tự, do đó sau đây hoạt động cho phần lớn các trường hợp. Để làm cho nó chung chung hơn một sẽ làm cho chính một đối tượng là tốt. – Dmitri

1

Cách tốt để kết xuất cấu trúc dữ liệu (ví dụ: tạo thành bản đồ lồng nhau, mảng và bộ) bằng cách tuần tự hóa nó thành định dạng JSON. Ví dụ: sử dụng Gson (com.google.gson):

Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
System.out.println(gson.toJson(dataStructure)); 

Điều này sẽ in ra cấu trúc dữ liệu phức tạp nhất theo cách khá dễ đọc.

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