[英]How to print an object which points to an array in Java
我有一張地圖,其定義如下
HashMap<Object, Object> hashMap;
現在,我需要遍歷每對並打印鍵和值。 對於諸如ArrayList
類的類型,執行key.toString()
和value.toString()
效果很好。 但是數組上的toString()
不會給出可讀的字符串。
我知道Arrays.toString()
。 但是我不能使用它,因為Arrays.toString()
需要一個對象數組,而我所擁有的只是一個對象。 所以我寫了一個自定義代碼,看起來像
private String convertToHumanReadableFormat(Object value) {
if (value == null) return "N/A";
if (value.getClass().isArray()) {
return convertArrayToReadableFormat(value);
}
return value.toString();
}
private String convertArrayToReadableFormat(Object value) {
String output = "[";
int arrayLength = Array.getLength(value);
for (int i = 0; i < arrayLength; i++) {
Object element = Array.get(value, i);
if (element != null) {
if (element.getClass().isArray()) {
output += convertArrayToReadableFormat(element);
}
else {
output += element.toString();
}
}
if ((i + 1) < arrayLength)
output += ", ";
}
output += "]";
return output;
}
我實際上是在復制Arrays.deepToString()
功能。 但是我看不到一種僅使用Arrays.toString()
或Arrays.deepToString()
。
這是解決問題的正確方法,還是有什么方法可以使這些標准方法對我有用?
任何幫助都會很棒。
請將方法convertToHumanReadableFormat
修改為以下內容。 我已經對其進行了測試,並且確實有效。
private <T> String convertToHumanReadableFormat(Object value) {
if (value == null) return "N/A";
if (value.getClass().isArray()) {
if( value instanceof int[]||value instanceof long[]){
List<T> list = new ArrayList<T>();
list.addAll((Collection<? extends T>) Arrays.asList(value));
return convertToHumanReadableFormat(list.toArray());
}else{
return Arrays.deepToString((Object[]) value);
}
}
return value.toString();
}
您可以將其他基本類型添加到if條件。
如果將數組轉換為列表然后使用toString怎么辦?
Arrays.asList(array)
您將需要以這種方式編寫輔助方法-
private String convertToHumanReadableFormat(Object value) {
if (value == null) return "N/A";
if (value.getClass().isArray()) {
value = Arrays.asList((Object[])value);
}
return value.toString();
}
要處理原語,您需要首先手動將數組轉換為列表-
private String convertToHumanReadableFormat(Object value) {
if (value == null) return "N/A";
if (value.getClass().isArray()) {
//convert array to list
int count = Array.getLength(value);
ArrayList<Object> list = new ArrayList<Object>();
for(int i=0; i<count; i++){
list.add(Array.get(value, i));
}
return list.toString(); //or value=list;
}
return value.toString();
}
您可以考慮幾種方法-
答:如果您對格式不嚴格,只想以人類可讀的方式打印HashMap內容,我建議您使用JSon序列化-如果人類可讀,則輸出。
您可以看到我們在Ovirt開源項目中所做的工作(克隆引擎項目的git repo) -engine \\ backend \\ manager \\ modules \\ utils \\ src \\ main \\ java \\ org \\ ovirt \\ engine \\ core \\ utils \\ serialization \\ json-查看那里的JsonObjectSerializer類。
B.如果您對格式有嚴格要求-您應該獲取地圖的entrySet,對其進行迭代,然后將對象插入ArrayList中。 之后,您可以使用toArray()方法返回一個數組,並使用上述方法。
切記,我建議您的ArrayList將是一個字符串的ArrayList,因此您必須獲取每個mapEntry並將其轉換為字符串,考慮使用toString()並查看其生成的格式是否足夠適合您。
如果用例是以人類可讀的形式渲染數組和其他對象圖,則可以使用模板解決方案(例如freemarker的速度)或將它們轉換為JSON(或XML)並對其進行偽造-對於此任務,我建議使用GSON / XStream 。
如果您希望將其用於調試目的,則只需堅持使用日志記錄系統並使用那里可用的標准轉換器(例如,在log4j中)
您可以只使用九個instanceof語句來調用適當的toString或deepToString方法。 如果確實使用自己的代碼,請記住使用StringBuilder並考慮到數組包含對自身或父維度的引用的可能性。 當前,您的代碼將遞歸直到堆棧溢出。 我建議使用instanceof還可以避免將代碼固有的原始值裝箱(從而提高性能)。 九個陳述不是很多,是嗎?
if (val instanceof Object[]) return Arrays.deepToString((Object[]) val);
if (val instanceof byte[]) return Arrays.toString((byte[]) val);
// Repeat for other 7 array types...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.