2013-03-02 31 views
7

Tôi muốn có thể in các nội dung của bản đồ.In ấn nhiều dòng đẹp (lồng nhau) bộ sưu tập trong Java

Họ phải có dòng mới và thụt lề thay vì trên một dòng; bỏ qua các phương thức toString của bộ sưu tập/iterables/etc; và đệ quy vào các bộ sưu tập lồng nhau.

Điều này đặc biệt quan tâm đối với tôi về bản đồ. Tôi cho rằng JSON'ing có thể có liên quan, nhưng tôi không muốn đi xa, hoặc ít nhất - tôi không muốn mã của tôi phải biết về JSON chỉ để tôi in đẹp. Các lựa chọn của tôi là gì (ngoài việc tự viết bài này)?

Trả lời

15

Bạn có thể sử dụng phương pháp MapUtils.debugPrint từ các bộ sưu tập commons apache để in bản đồ lồng nhau.

Phương pháp này in một chuỗi được định dạng độc đáo mô tả Bản đồ. Mỗi mục nhập bản đồ sẽ được in với tên khóa, giá trị và giá trị. Khi giá trị là Bản đồ, hành vi đệ quy xảy ra.

+1

không hoạt động, hãy thử cách này - http://commons.apache.org/proper/commons-collections/javadocs/api-2.1.1/org/apache/commons/collections/MapUtils.html – gauravphoenix

+0

@gauravphoenix Tôi đã cập nhật liên kết. Lưu ý rằng bạn đã liên kết với phiên bản 2.1.1, trong khi có phiên bản 3.2.1. (4.0 vẫn là alpha) – lbalazscs

1

Tôi không chắc chắn 100%, có thể là những gì bạn đang tìm kiếm và mà bạn gọi là khá in -

Map<Integer,String> map = new HashMap<Integer,String>(); 
... 
for(Map.Entry<Integer,String> entry: map.entrySet()){ 
    System.out.println(entry.getKey()+" - "+ entry.getValue()); 
} 
+0

Điều này không thụt lề và không giúp tôi với bản đồ lồng nhau (hoặc các bộ sưu tập khác). – einpoklum

+0

Chỉ là một lần lặp lại trên một bản đồ. Trong trường hợp bạn có bộ sưu tập lồng nhau, bạn có thể sử dụng vòng lặp lồng nhau bên trong nó. –

3

Hãy thử thay thế khi bắt đầu mỗi mục với dòng sản phẩm mới và tab như thế này

myMap.toString().replace("[", "\n\t[");

+0

Cách tiếp cận này thiếu nhận dạng phù hợp theo không gian. Liên kết –

1

Tôi đang tìm một bản in các bộ sưu tập lồng nhau trong Java đã đưa tôi đến đây. Tuy nhiên, câu trả lời chỉ hoạt động cho Maps vì vậy tôi nghĩ tôi sẽ thêm giải pháp của mình cho Bộ sưu tập lồng nhau. Nó tạo ra một đầu ra giống như JSON, nếu bạn muốn dòng mới thêm "] \ n" thay vì ']'.

Lưu ý rằng điều này sẽ không tạo ra đầu ra khá nếu Object [] chứa các phần tử lồng nhau. Bạn sẽ cần phải viết một phương thức riêng để xử lý các mảng lồng nhau. Ngoài ra nó sẽ không in các mảng nguyên thuỷ, vì bạn cần một câu lệnh khác cho mọi kiểu mảng nguyên thủy.

private static <A extends Collection<B>, B> String nestedToString(A collection) { 
    if (collection == null) 
     return "null"; 

    String ret = ""; 

    Iterator<B> colIterator = collection.iterator(); 
    if (colIterator.hasNext()) { 
     ret += '['; 
     while (colIterator.hasNext()) { 
      B object = colIterator.next(); 
      if (object == null) { 
       ret += "null"; 
      } else if (object instanceof Collection) { 
       ret += nestedToString((Collection) object); 
      } else if (object instanceof Object[]) { 
       ret += Arrays.deepToString((Object[]) object); 
      } else { 
       ret += object; 
      } 
      if (colIterator.hasNext()) { 
       ret += ", "; 
      } 
     } 
     ret += ']'; 
    } 
    return ret; 
}