不同类型的数组
是否可以拥有包含两种不同类型数据的数组? 我想要一个包含double和字符串的数组。 我尝试过:
ArrayList array;
但那没用。
抱歉这个愚蠢的问题,但已经有一段时间了,因为我使用过这样的东西..你能否刷新我的内存,我将如何声明和填充这样的数组?
然后再进一步,如果可能的话,我想用双排序数组?
谢谢!
首先,值得清楚的是数组和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
实现Comparable
– 但除非这是唯一有意义的自然顺序,否则我会编写一个Comparator
:
public class DoubleComparator implements Comparator { public int compare(DoubleAndString ds1, DoubleAndString ds2) { return Double.compare(ds1.getDouble(), ds2.getDouble()); } }
然后,您可以使用Collections.sort
对ArrayList
或Arrays.sort
进行排序以对数组进行排序。
您可以使用ArrayList
,然后您可以使用您想要的任何内容。 将Double
封装在Double
对象中,当您检索对象时,使用instanceof
来检查它是否真的是double
或String
。
我必须说,这种“设计”不太可能赢得任何奖项。 是否有可能重新考虑您正在为您的问题考虑的解决方案,并看看您是否可以采用不同的方法?
您可能已经知道这一点,但在列表中存储不同类型并不是一个好主意。 根据定义,数组是类似对象的集合,并且其中的各种填充使得事物模糊。 所以你真的想要一个单独的类型来保存这些不同的值。
听起来你想要一张地图。 由于您希望对Map进行排序,因此TreeMap可能是最佳的。
Map myMap = new TreeMap();
地图是关联的。 每个double都有一个相关的字符串。 如果你想要每个双重多个字符串,你可以使用a
Map>
好吧,如果你想拥有一个包含任意数量元素的数组,那么你只需要使用一个共同祖先的类型。 在这种情况下,那将是Object(因为String和Double都从Objectinheritance)。 但是,当您检索或使用它们时,这将要求您检查类型。
如果你使用固定数量的多种不同类型,那么你真正想要的是一个“元组”。 但是,Java目前没有可用的元组实现。 两个项目:
public class Pair { 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; }
你可以只做ArrayList
然后你可以放任何东西,但这可能不是你想要的。
那么,为了排序你只需要使用你自己的比较器,但是,如上所述,这两个值应该是连接的,还是你有一个具有两种不同数据类型的单维数组?
根据定义,ArrayList每个位置只包含一个对象。 你可以这样做:
List list = new ArrayList (); public static class MyTuple implements Comparable { private Double doubleValue; private String stringValue; //getters and setters public int compareTo(MyTuple tuple) { return doubleValue.compareTo(tuple.getDoubleValue()); } }
然后,您可以使用Collections.sort()方法按双打对其进行排序。
你想让我做什么?
如果它不是键值映射,则应为此创建一个新类。
您可能想要查看Number基类。
List list = new ArrayList (); list.add(new Integer(3)); list.add(new Double(5.2));
您可以使用NumberFormat将数字解释为字符串:
NumberFormat formatter = new DecimalFormat("#.##"); String s = formatter.format(list.get(0));
虽然这可能不是您想要的,但您对最终目标的详细信息有点缺失。
如果您基本上没有尝试对ArrayList进行任何比较/排序,那么您可以创建如下内容:
List list = new ArrayList();
否则.. Jon Skeet的答案是最好的方法。