2013-03-23 68 views
0

我打印出存儲在地圖中的字符串值,但我不希望它打印[]或分隔符。如何僅打印值?如何在沒有[...]和分隔符的地圖中打印出值(字符串)?

Iterator<String> iterator = styles.keySet().iterator(); 
while (iterator.hasNext()) { 
    String key = iterator.next().toString(); 
    String value = styles.get(key).toString(); 
    stylePlaceHolder = value + "\n"; 
} 
siteElements.add(stylePlaceHolder); 

Iterator<String> iterator2 = libraries.keySet().iterator(); 
while (iterator2.hasNext()) { 
    String key = iterator2.next().toString(); 
    String value = libraries.get(key).toString(); 
    libPlaceHolder = value + "\n"; 
    System.out.println(libraries.values().toString()); 
} 

生成:

03-23 17:56:56.350: I/System.out(9642143): [<script src="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js"></script> 
03-23 17:56:56.350: I/System.out(9642143): 
, <link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0. 
min.css" /> 

03-23 17:56:56.350: I/System.out(9642143): , <script src="http://code.jquery.com/jquery-1.8.2.min.js"></script> 
03-23 17:56:56.350: I/System.out(9642143): 
] 
+0

您可以循環更efficently在使用'entrySet'方法遍歷entryies地圖。您甚至可以使用增強型for循環 - for(最終條目條目:myMap.entrySet())'。 – 2013-03-23 21:14:26

回答

1

由於您只關心打印出styles的值,因此請勿打擾keySet。由於您正在循環構建stylePlaceHolder,因此使用StringBuilder而不是String級聯。而且,當你的循環獲得另一個值時,你的循環會丟棄每個值。

StringBuilder b = new StringBuilder(); 
for(String style: styles.valueSet()) { 
    b.append(style).append("\n"); 
} 
siteElements.add(b.toString()); 

libraries幾乎相同。事實上,大多數提取上述的一種方法:

private String values(Map<?, ?> map) { 
    StringBuilder b = new StringBuilder(); 
    for(Object value: map.valueSet()) { 
     b.append(value).append("\n"); 
     // append can take an Object; it calls toString on it. 
    } 
    return b.toString(); 
} 

爲了更快地工作,考慮谷歌番石榴及其Joiner類代替。記住 - 沒有人會付錢給你寫代碼。你有償解決問題。

private String values(Map<?, ?> map) { 
    return Joiner.on("\n").join(map.valueSet()) + "\n"; 
} 
2

HashMap中或任何地圖類的的toString()的版本創建一個帶有[]在其中的字符串。所以你不能幫助它。你可以做的最好的事情是遍歷地圖,並以你想要的方式自己打印值。

如果您嘗試打印Java中的任何集合(如List,Set或Map),情況也是如此。

如:

List<Integer> list = new ArrayList<Integer>(); 
    list.add(10); 
    list.add(20); 

    System.out.println(list); 

    // Output is : [10, 20] 
1

看起來你是依靠的東西toString方法沒有覆蓋它。你還沒有告訴我們你的地圖的value部分是什麼。

您可能需要重寫你的對象的toString方法,或者,如果該對象是另一個Collection,您可能需要循環,太多:

final Map<String, Collection<String>> map = new HashMap<>(); 
    for(final Entry<String, Collection<String>> entry : map.entrySet()) { 
     System.out.println(entry.getKey()); 
     for(final String value : entry.getValue()) { 
      System.out.println(value);     
     } 
    } 

注意,您可以使用for循環的增強,迭代Map比循環遍歷密鑰更有效,併爲每個密鑰調用get

1

不喜歡正則表達式?

Map<String, String> map = new HashMap<>(); 
    map.put("key1", "value1"); 
    map.put("key2", "value2"); 
    map.put("key3", "value3"); 
    System.out.println(map.keySet()); 
    System.out.println(map.keySet().toString().replaceAll("[\\[\\],]", "")); 
    System.out.println(map.values().toString().replaceAll("[\\[\\],]", "")); 

輸出:

[key3, key2, key1] 
key3 key2 key1 
value3 value2 value1 
+0

'map.put(「[what,about]」,「[th,is?]」);' – yshavit 2013-03-23 23:00:22

+0

夠公平的,但並不意味着它是一個通用的解決方案, Just cause:.toString()。replaceAll(「^ \\ [」,「」).replaceAll(「\\] $」,「」).replaceAll(「,」,「」)); (現在變得有點傻) – 2013-03-23 23:27:41

相關問題