2012-04-12 20 views
94

Map'u güzel bir şekilde basmak için güzel bir yol arıyorum. Java'da bir haritayı Pretty-Print

map.toString()

bana verir: {key1=value1, key2=value2, key3=value3}

benim haritası giriş değerlerinde daha fazla özgürlük istiyor ve daha böyle bir şey için arıyorum:

StringBuilder sb = new StringBuilder(); 
Iterator<Entry<String, String>> iter = map.entrySet().iterator(); 
while (iter.hasNext()) { 
    Entry<String, String> entry = iter.next(); 
    sb.append(entry.getKey()); 
    sb.append('=').append('"'); 
    sb.append(entry.getValue()); 
    sb.append('"'); 
    if (iter.hasNext()) { 
     sb.append(',').append(' '); 
    } 
} 
return sb.toString(); 
:

key1="value1", key2="value2", key3="value3" Ben bu kod küçük yazı yazmıştı

Ama bunun için daha zarif ve özlü bir yol olduğundan eminim.

+1

olası yinelenen iç içe geçmiş karmaşık türlerini destekler Java] (http://stackoverflow.com/questions/2828252/map-to-string-in-java) çünkü burada ve System.out.println'nın istenen biçimi çok yakın. Ve eğer özel bir şey istiyorsanız, bu, başka birçok cevabı olan "Java'da bir harita üzerinde nasıl yinelenecek" anlamına gelir. –

cevap

50

Veya mantığınızı düzenli bir küçük sınıfa yazınız.

public class PrettyPrintingMap<K, V> { 
    private Map<K, V> map; 

    public PrettyPrintingMap(Map<K, V> map) { 
     this.map = map; 
    } 

    public String toString() { 
     StringBuilder sb = new StringBuilder(); 
     Iterator<Entry<K, V>> iter = map.entrySet().iterator(); 
     while (iter.hasNext()) { 
      Entry<K, V> entry = iter.next(); 
      sb.append(entry.getKey()); 
      sb.append('=').append('"'); 
      sb.append(entry.getValue()); 
      sb.append('"'); 
      if (iter.hasNext()) { 
       sb.append(',').append(' '); 
      } 
     } 
     return sb.toString(); 

    } 
} 

Kullanımı:

Map<String, String> myMap = new HashMap<String, String>(); 

System.out.println(new PrettyPrintingMap<String, String>(myMap)); 

Not: Ayrıca bir yardımcı yöntem haline o mantığı koyabilirsiniz.

1

Sen yaparak ne istediğinizi yapmak gerekir: Bir de
{key1=value1, key2=value2}: haritada TÜM Nesnelerinizin göreceğiniz toString yöntemi overiden gibi

System.out.println(map) örneğin

sürece anlamlı yol

Eğer bu sizin kodunuz içinse, o zaman toString cevabı iyi bir alışkanlıktır ve bunun yerine bunun yerine gitmenizi öneririm.

Nesnelerinizin String s olduğu örnek için, başka hiçbir şey yapmadan iyi olmalısınız.
I.e. System.out.println(map), fazladan kod yazmadan tam olarak ihtiyacınız olan şeyi yazdıracaktır.

+1

onun anahtarları ve değerleri dizeleridir; Sanırım tSt kapsamındaki toString yöntemini aldı. – Tom

+0

Haklısın, ama belki de onun dikkatini çekmek için önemsiz bir örnek kopyaladı.Ama yanıtı güncelledim – Cratylus

+0

Evet, haritamın Harita olduğunu belirtmeliydim. Ama aynı zamanda giriş değerlerimde daha fazla serbestlik istediğimi de belirttim, örneğin bir girişin değeri içinde virgülle ayrılmış listelere sahip olmak. Bu yüzden Map.toString() yapmayacaktır. –

0

Böyle bir şey (sadece şablonu değiştirmek) daha temiz ve çıkış biçimi ile daha fazla esneklik sağlamak olacağını tahmin:

String template = "%s=\"%s\","; 
    StringBuilder sb = new StringBuilder(); 
    for (Entry e : map.entrySet()) { 
     sb.append(String.format(template, e.getKey(), e.getValue())); 
    } 
    if (sb.length() > 0) { 
     sb.deleteCharAt(sb.length() - 1); // Ugly way to remove the last comma 
    } 
    return sb.toString(); 

Geçen virgül çirkin kaldırmak zorunda biliyorum, ama sanırım Bir in this solution gibi alternatiflerden daha temiz ya da bir yineleyici kullanarak manuel olarak. OpenJDK kaynaklarında HashMap#toString() ve AbstractMap#toString() için koda

4

Görünüş:

class java.util.HashMap.Entry<K,V> implements Map.Entry<K,V> { 
     public final String toString() { 
      return getKey() + "=" + getValue(); 
     } 
    } 
class java.util.AbstractMap<K,V> { 
    public String toString() { 
     Iterator<Entry<K,V>> i = entrySet().iterator(); 
     if (! i.hasNext()) 
      return "{}"; 

     StringBuilder sb = new StringBuilder(); 
     sb.append('{'); 
     for (;;) { 
      Entry<K,V> e = i.next(); 
      K key = e.getKey(); 
      V value = e.getValue(); 
      sb.append(key == this ? "(this Map)" : key); 
      sb.append('='); 
      sb.append(value == this ? "(this Map)" : value); 
      if (! i.hasNext()) 
       return sb.append('}').toString(); 
      sb.append(", "); 
     } 
    } 
} 

Yani OpenJDK adamlar

2
:-) orada yok, bunu yapmak için daha şık bir yol bulmak olmasaydı
public void printMapV2 (Map <?, ?> map) { 
    StringBuilder sb = new StringBuilder(128); 
    sb.append("{"); 
    for (Map.Entry<?,?> entry : map.entrySet()) { 
     if (sb.length()>1) { 
      sb.append(", "); 
     } 
     sb.append(entry.getKey()).append("=").append(entry.getValue()); 
    } 
    sb.append("}"); 
    System.out.println(sb); 
} 
0

Mevcut altyapıdan yararlanarak hızlı ve kirli bir çözüm olarak, uglyPrintedMap ürününü java.util.HashMap içine sardıktan sonra toString() kullanın.kurtarmaya

Joiner.MapJoiner mapJoiner = Joiner.on(",").withKeyValueSeparator("="); 
System.out.println(mapJoiner.join(map)); 
56

Guava kütüphanede göz at!

MapUtils.debugPrint(System.out, "myMap", map); 

Tüm

Apache commons-koleksiyonları kitaplık gerekir ( project link)

bu bağımlılığı kullanarak kütüphane ekleyebilir

Maven kullanıcıları:

<dependency> 
    <groupId>commons-collections</groupId> 
    <artifactId>commons-collections</artifactId> 
    <version>3.2.1</version> 
</dependency> 
221
Arrays.toString(map.entrySet().toArray()) 
+5

Wow .... inanılmaz basit ve çalışan bir çözüm ... Teşekkürler –

+6

Eğer Harita > 'varsa o kadar iyi değil, o zaman bu tür bir sting alırsınız:' [ test = {test = [D @ 3995ebd8, 2 = [D @ 26fa5067, 3 = [D @ d956d37, 4 = [D2cead81, 5 = [D 14934d2b} ...] '' – zygimantus

+4

kara büyü gibi çalışır! –

24

Apache kütüphaneleri:

uglyPrintedMap.toString(); // ugly 
System.out.println(uglyPrintedMap); // prints in an ugly manner 

new HashMap<Object, Object>(jobDataMap).toString(); // pretty 
System.out.println(new HashMap<Object, Object>(uglyPrintedMap)); // prints in a pretty manner 
+0

Bu, dizileri harita değerleri olarak ele almaz (ör. '). Gerçek değerler yerine sadece className ve hash basılır. –

8

ben sınıf yolunda org.json.JSONObject olunca, yapın:

Map<String, Object> stats = ...; 
System.out.println(new JSONObject(stats).toString(2)); 

(Bu güzel girintiler listesi, bir iç içe geçmiş olabilecek nd haritalar)

6

Kolay ve basit. JSON dünyasına hoş geldiniz. Google's Gson kullanma: haritanın

new Gson().toJson(map) 

Örnek 3 tuşlarıyla: Java 8 akımlarını kullanarak

{"array":[null,"Some string"],"just string":"Yo","number":999} 
1

:

Map<Object, Object> map = new HashMap<>(); 

String content = map.entrySet() 
        .stream() 
        .map(e -> e.getKey() + "=\"" + e.getValue() + "\"") 
        .collect(Collectors.joining(", ")); 

System.out.println(content); 
+0

Eğer bir soruya gidecekseniz, en azından doğru bir şekilde cevaplayın! Değerin üzerindeki alıntıları kaçırıyorsunuz ve ',' ile birleştirilmelidir. – AjahnCharles

2

Ben bir JSON dize o haritayı dönüştürmek için tercih geçerli:

  • standart
  • insan editörler tam olarak
  • gittikten nesnenin hangi bölümünün rapor böylece
  • JPath destekler göstermek/sözdizimi vurgulama, biçimlendirme ve bölüm postu ile, Sublime, VS Kanunu gibi editörler desteklenen okunabilir
  • nesnenin içinde string Harita [arasında

    import com.fasterxml.jackson.core.JsonProcessingException; 
    import com.fasterxml.jackson.databind.ObjectMapper; 
    
    public static String getAsFormattedJsonString(Object object) 
    { 
        ObjectMapper mapper = new ObjectMapper(); 
        try 
        { 
         return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(object); 
        } 
        catch (JsonProcessingException e) 
        { 
         e.printStackTrace(); 
        } 
        return ""; 
    } 
    
İlgili konular