簡體   English   中英

如何在Java中打印指向數組的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM