不同类型的数组

时间:2010-05-12 01:48:25

标签: java

是否可以拥有包含两种不同类型数据的数组?我想要一个包含double和字符串的数组。我试过了:

ArrayList<double><String> array;

但那没用。

很抱歉这个愚蠢的问题,但是我已经用了一段时间了,因为我已经使用了这样的东西..你能不能刷新我的内存,我将如何声明和填充这样的数组?

然后再向前迈进一步,如果可能,我想用双排序数组?

谢谢!

10 个答案:

答案 0 :(得分:14)

首先,值得清楚的是数组与ArrayList之间的区别 - 它们根本不是一回事。

然而,在任何一种情况下,你都无法做你想做的事。你可能来的最接近的是声明你自己的类型。 (编辑:我原来的代码有一个双一个字符串...我现在把它改成了一个双一个字符串。让我知道这个改变是否< em>不是你的想法。)

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.sortArrayList<DoubleAndString>Arrays.sort进行排序以对数组进行排序。

答案 1 :(得分:6)

您可以使用ArrayList<Object>,然后您可以使用您想要的任何内容。将double封装在Double对象中,当您检索对象时,使用instanceof检查它是否真的是doubleString

我必须说,这种“设计”不太可能赢得任何奖项。是否有可能重新考虑您正在为您的问题考虑的解决方案,看看您是否可以采用不同的方法?

答案 2 :(得分:3)

您可能已经知道这一点,但在列表中存储不同类型并不是一个好主意。根据定义,数组是类似对象的集合,并且其中的各种填充使得事物模糊。所以你真的想要一个单独的类型来保存这些不同的值。

答案 3 :(得分:2)

听起来你想要一张地图。由于您希望对Map进行排序,因此TreeMap可能是最佳的。

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

地图是关联的。每个double都有一个相关的字符串。如果你想要每个双字符串多个字符串,你可以使用

Map<Double, ArrayList<String>>

答案 4 :(得分: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;
}

答案 5 :(得分:2)

你可以ArrayList<object> arraylist然后你可以放任何东西,但这可能不是你想要的。

然后,为了排序你只需要使用你自己的比较器,但是,如上所述,这两个值应该是连接的,还是你有一个具有两种不同数据类型的单维数组?

答案 6 :(得分: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()方法按双打对其进行排序。

答案 7 :(得分:1)

你想做什么?

如果它不是键值映射,则应为此创建一个新类。

答案 8 :(得分: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));

虽然这可能不是您想要的,但您对最终目标的详细信息有点缺失。

答案 9 :(得分:0)

如果您基本上没有尝试对ArrayList进行任何比较/排序,那么您可以创建如下内容:

List list = new ArrayList();

否则.. Jon Skeet的答案是最好的方法。