是否可以拥有包含两种不同类型数据的数组?我想要一个包含double和字符串的数组。我试过了:
ArrayList<double><String> array;
但那没用。
很抱歉这个愚蠢的问题,但是我已经用了一段时间了,因为我已经使用了这样的东西..你能不能刷新我的内存,我将如何声明和填充这样的数组?
然后再向前迈进一步,如果可能,我想用双排序数组?
谢谢!
答案 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.sort
对ArrayList<DoubleAndString>
或Arrays.sort
进行排序以对数组进行排序。
答案 1 :(得分:6)
您可以使用ArrayList<Object>
,然后您可以使用您想要的任何内容。将double
封装在Double
对象中,当您检索对象时,使用instanceof
检查它是否真的是double
或String
。
我必须说,这种“设计”不太可能赢得任何奖项。是否有可能重新考虑您正在为您的问题考虑的解决方案,看看您是否可以采用不同的方法?
答案 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的答案是最好的方法。