2010-05-12 122 views
8

是否有可能擁有包含兩種不同類型數據的數組?我想要一個包含double和字符串的數組。我嘗試過:不同類型的數組

ArrayList<double><String> array; 

但這並不奏效。

對不起,這個愚蠢的問題,但它已經有一段時間,因爲我已經使用了這樣的東西..你可以刷新我的記憶我將如何聲明和填充這樣一個數組?

然後再進一步,我想如果可能的話用double來排序數組?

謝謝!

+1

不,這是不可能的。你究竟想要做什麼?也許我們可以幫助您想出一個解決方法。 – 2010-05-12 01:49:38

回答

14

首先,它的價值是明確的數組和ArrayList之間的區別 - 他們是不一樣的東西都沒有。

但是,在任何一種情況下,您都無法做到您想要的。你可能最接近的是宣佈你自己的類型。 (編輯:我原來的代碼有一個雙重一個字符串...我現在已經改變它是一個雙重一個字符串。讓我知道如果這個變化不是你想到的。 )

public final class DoubleAndString 
{ 
    private final String stringValue; 
    private final double doubleValue; 

    public DoubleAndString(String stringValue, double doubleValue) 
    { 
     this.stringValue = stringValue; 
     this.doubleValue = doubleValue; 
    } 

    public String getString() 
    { 
     return stringValue; 
    } 

    public String getDouble() 
    { 
     return doubleValue; 
    } 
} 

然後創建一個ArrayList<DoubleAndString>DoubleAndString[]

現在,這種感覺有點像香草 - 大概雙重和字符串值實際上有更大的意義 - 例如名稱和分數。如果是這樣,請將其封裝在更適合描述配對的類型中。

至於排序 - 你可以使DoubleAndString實施Comparable<DoubleAndString> - 但除非這就是只有自然順序,這是有道理的,我會寫一個Comparator<DoubleAndString>

public class DoubleComparator implements Comparator<DoubleAndString> 
{ 
    public int compare(DoubleAndString ds1, DoubleAndString ds2) 
    { 
     return Double.compare(ds1.getDouble(), ds2.getDouble()); 
    } 
} 

然後你可以使用Collections.sort來對ArrayList<DoubleAndString>Arrays.sort進行排序以對數組進行排序。

+0

+1,beat'd。這將是我的建議和自定義數據類型。 – Robb 2010-05-12 01:53:47

2

這聽起來像你想要的地圖。既然你想排序Map,TreeMap可能是最優的。

Map<Double, String> myMap = new TreeMap<Double, String>(); 

地圖是關聯的。每個double都有一個關聯的字符串。如果你想每個雙人間多個字符串,你可以使用一個

Map<Double, ArrayList<String>> 
1

你想做什麼?

如果它不是一個鍵值映射,你應該爲此創建新類。

2

好吧,如果你想與元素任意數量的數組,然後你只需要使用一個類型,它是一個共同的祖先兩者。在這種情況下,這將是Object(因爲String和Double都從Object繼承)。這將需要您檢查類型,但是,當您檢索或使用它們時。

如果您正在使用多個不同類型的固定號碼,那麼你真的想要的是一個「元組」。但是,Java目前沒有可用的元組實現。對於兩個項目:

public class Pair<T1,T2> 
{ 
    public Pair(){ 
      this(null,null); 
    } 

    public Pair(T1 x1){ 
      this(x1,null); 
    } 

    public Pair(T1 x1, T2 x2){ 
     _x1 = x1; 
     _x2 = x2; 
    } 

    public T1 getFirst(){ 
     return _x1; 
    } 

    public T1 getSecond(){ 
     return _x2; 
    } 

    private T1 _x1; 
    private T2 _x2; 
} 
2

你可以做ArrayList<object> arraylist,然後你可以把任何東西在裏面,但是這可能不是你想要的。

然後進行排序,你只想用自己的比較,但正如theatrus提到的,應該是連接這兩個值,還是你有兩個不同的數據類型一維數組?

5

您可以使用ArrayList<Object>,然後你可以使用任何你想。封裝doubleDouble對象,當你檢索對象使用instanceof檢查,如果這真是一個doubleString

我必須說,這是不太可能在「設計」會爲你贏得任何獎項。是否有可能重新考慮您針對您的問題考慮的解決方案,並查看您是否可以採用其他類型的方法?

3

你可能已經知道這一點,但它不是肯定不會存儲不同類型的列表是一個好主意。根據定義,數組是一個類似對象的集合,並且填充所有類型,這使得事物變得模糊。所以你真的寧願有一個單獨的類型來保存這些不同的值。

2

根據定義,ArrayList僅在每個位置包含一個對象。你可以這樣做:

List<MyTuple> list = new ArrayList<MyTuple>(); 

public static class MyTuple implements Comparable<MyTuple> { 

    private Double doubleValue; 
    private String stringValue; 

    //getters and setters 

    public int compareTo(MyTuple tuple) { 
     return doubleValue.compareTo(tuple.getDoubleValue()); 
    } 
} 

然後,您可以使用Collections.sort()方法按照雙精度對它進行排序。

0

你可能想看看Number基類。

List<Number> list = new ArrayList<Number>(); 
list.add(new Integer(3)); 
list.add(new Double(5.2)); 

你可以解釋這些數字作爲字符串,使用的NumberFormat:

NumberFormat formatter = new DecimalFormat("#.##"); 
String s = formatter.format(list.get(0)); 

雖然這可能不是你想要的,你是一個有點短關於你的最終目標的詳細信息。

0

如果你基本上沒有試圖做任何比較/對ArrayList的排序,那麼你可以創建如下的內容:

名單列表=新的ArrayList();

否則.. Jon Skeet的回答是最好的方法。