2009-10-05 56 views
4

我使用toString方法ArrayListArrayList數據存儲到字符串中。我的問題是,我該如何走另一條路?是否有現成的方法將String實例中的數據解析回ArrayListJava ArrayList的(ArrayList).toString的反轉是什麼?

+4

注意,如果列表中的元素不是String對象,則反向操作可能是不可能做到的,因爲'theList.toString()'將調用'的toString()'上的所有元素,並且可能會或可能不是可逆動作(即,字符串表示可能不包含重現原始對象所需的全部信息)。 – 2009-10-05 07:01:04

回答

7

簡短答案是「否」。沒有簡單的方法從字符串中重新導入對象,因爲某些類型信息在toString()序列化中丟失。

然而,對於特定的格式和特定​​(已知)的類型,你應該能夠編寫代碼來解析手動的字符串:

// Takes Strings like "[a, b, c]" 
public List parse(String s) { 
    List output = new ArrayList(); 
    String listString = s.substring(1, s.length() - 1); // chop off brackets 
    for (String token : new StringTokenizer(listString, ",")) { 
    output.add(token.trim()); 
    } 
    return output; 
} 

從他們系列化形式重建的對象通常被稱爲反序列化

+0

在這種情況下,我使用的是字符串,所以我猜想自己解析它很簡單。謝謝。 – user174772 2009-10-05 16:26:50

+3

當然,這隻有在字符串本身不包含逗號字符時纔有效,這是我的回覆中的第一點。 – 2009-10-05 17:51:42

+0

我個人會爲此創建一個編解碼器類,因此可以對該類進行參數化(稍後),並檢查特定的好/壞編碼。 – 2014-10-25 13:53:40

0

我會推薦使用一些標準格式和庫來代替它。

JSON可能是最接近語法上的。

另外一些基於XML或序列化的解決方案也可以工作。這當然取決於你的需求。

+0

List.toString()格式與JSON完全不同。實際上它很簡單(而且功能也不那麼強大)。使用JSON庫是矯枉過正的(可能只是錯誤)。 – 2009-10-05 07:08:35

+1

實現自己的buggy解析器是錯誤的。經常使用測試過的庫會更好。 – iny 2009-10-05 17:24:23

0

ArrayList由什麼組成?正如其他說,它可能在某些情況下是不可能的,但很可能與保證工作如果

  • 陣列的元件的每個字符串表示可被明確地標識的(因爲它可以是,例如,如果ArrayList包含Integer s)

  • 有一種方法可以通過其字符串表示形式創建原始類型的對象。我覺得最優雅的用靜態方法fromString

當然,這模仿了整個(德)序列化框架做到這一點。

-1

Apache Commons ftw。

Arrays.asList(StringUtils.split(StringUtils.substringBetween("[1, 2, 3]", "[", "]"), ", "))