2013-07-04 58 views
1

我有一個值列表,我需要在運行時存儲任何類型的值(主要是int,double,date,...)。後來我需要處理這些。我應該如何解決這個問題?創建並處理一般類型列表

這就是我想到的,它似乎工作,但我不知道這是否是解決此問題的正確方法。

ArrayList<Object> list = new ArrayList<Object>(); 

    list.add("hello"); 
    list.add(1); 
    list.add(0.5); 

    for (int i = 0; i < list.size(); i++) 
    { 
     Object obj = list.get(i); 

     if (obj instanceof Integer) 
     { 
      System.out.println((double)obj); 
     } 
     else if (obj instanceof String) 
     { 
      System.out.println(obj.toString()); 
     } 
     else 
     { 
      System.out.println("Unable to deal with type."); 
     } 
    } 
+1

它必須是太** **通用持有'int','double','Date'等。 – NINCOMPOOP

+1

你應該反思一下,你結構中的數據,以避免這種 – Tala

+1

你的方法看起來是那樣的精細。有時這種使用'instanceof'的檢查是不可避免的。 –

回答

4

我知道你的例子可能是簡單的,但我會介紹一個包裝爲所有的人都表示無論是他們之間共同的在你的世界。這裏有一個例子:

interface PrintableThing { 
    string specialToString(); 
} 

class IntPrintable implements PrintableThing { 
    private final int int_; 

    public IntPrintable(int a) { int_ = a; } 
    public specialToString() { return ((double)int_).toString(); } 
} 

等等。現在,您只需遍歷ArrayList<PrintableThing>的列表,並要求每個元素執行specialToString方法。

+0

問題是他們沒有真正共享任何共同點。他們只是價值觀。我不知道它們將如何處理,所以我寧願不將日期轉換爲字符串,然後在需要處理時再返回日期。 – Cheetah

0

此外,您可以創建一個自定義javabean類來保存這些數據類型。就像這樣:

class data{ 
    private Double double1; 
    private int int1; 
    private String1; 
} 

,你可以使這個類類型的列表:

List<data> l = new List<data>(); 

在我看來更有意義,你當前的實現。

0

通常,您將使用通用類型來確保Collection僅保存該類型的元素。所以沒必要說ArrayList的元素的類型爲Object,因爲這是正常的。

當您轉換爲其他類型時,請確保使用您使用instanceof測試的類型,否則您可能會遇到ClassCastException。我的意思是oyur線,您將Integer的對象轉換爲原始的雙倍。

否則它是O.K.

而且一個提示,而不是使用:

for (int i = 0; i < list.size(); i++) 

可以使用

for (Object obj : list) 
+1

很確定它:'for(Object obj:list)' – Cheetah

+0

copyNpaste可能會非常棘手,謝謝:D –

2

兩個這樣做的方法,我能想到的:

  1. 正如您所提供的代碼顯示,在else-if中檢查instanceof的每個對象。

  2. 使用您將應用於對象的一組方法創建抽象類(或界面)toString()(在許多情況下 - 已按照您希望的方式實施)。

+1

但是有時它可能不適合您的需求,所以您需要創建自己的實現。 – wassup