2010-05-12 90 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的回答是最好的方法。