我编写了一个程序,其中有 4 个数字。第一个数字是 ID。(int) 其他 3 个只是地图上的点。(双倍的)
我想在它自己的类中创建一个数组数组,理想情况下它存储这 3 个数字并使用第一个作为 ID。
数组列表是一个好方法吗?我真的只是在数据结构上苦苦挣扎。它的本质很简单。我只需要将一堆数字存储在数组数组中。我能做到。但是,将其存储在不同的类中很困难。
我编写了一个程序,其中有 4 个数字。第一个数字是 ID。(int) 其他 3 个只是地图上的点。(双倍的)
我想在它自己的类中创建一个数组数组,理想情况下它存储这 3 个数字并使用第一个作为 ID。
数组列表是一个好方法吗?我真的只是在数据结构上苦苦挣扎。它的本质很简单。我只需要将一堆数字存储在数组数组中。我能做到。但是,将其存储在不同的类中很困难。
由于 Java 是一种面向对象的语言,因此只需使用自定义类:
class MyPoint {
double x, y, z;
}
或者如果你真的需要一个数组
class MyPoint {
double[] coords;
}
然后它取决于你的 id 是什么,如果它是一个没有“洞”的自动增量值,你可以只拥有一个ArrayList<MyPoint>
如果你需要随机访问。
如果它是一个稀疏索引并且您仍然需要随机访问,那么使用HashMap<Integer, MyPoint>
. TreeMap<Integer, MyPoint>
如果您需要对它们进行排序(按 id 或按位置),则可以使用 a 。
如果这三个点彼此相关,请考虑为它们引入一种类型,例如MyPoints
并将它们存储在地图中以进行查找,如下所示:
Map<Integer, MyPoints> myMap = new HashMap<Integer, MyPoints>
请记住覆盖hashCode
和equals
方法以MyPoints
使地图按预期运行,即考虑两个MyPoint
具有相同内容的实例相等。
您也可以使用 aMap
并将您的 id 用作键,然后使用带有您的点的数组。
Map<Integer,Double[]> map = new HashMap<Integer,Double[]>();
你为什么不创建一个模型类并在你的控制器类中使用它呢?我想这会让我轻松很多。
class SomeModel {
// getters and setters }
class Controller {
public SomeModel model;
//getter and setter for model
}
为什么不使用MultiMap
Apache Commons Collections 中的 a:请参见此处
MultiMap
为同一个键关联多个值。(这是透明的,这就是为什么MultiMap
在这种情况下有用)。
MultiMap idWithDoubles = new MultiHashMap();
idWithDoubles.put(1, 1.1);
idWithDoubles.put(1, 1.2);
idWithDoubles.put(1, 1.3);
然后,您可以检索特定 id 的 Doubles 列表:
List list = (List) idWithDoubles.get(1);
默认返回 anArrayList
值:1.1, 1.2, 1.3
您还可以在此处查看 Guava 版本(最新):
利用Map
Map<Integer, Double[]> map = new HashMap<Integer, Double[]>();
因此,对于每个 Integer ID,您都有一组关联的值。
要遍历HashMap
,
Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry hashValues = (Map.Entry)it.next();
System.out.println(hashValues.getKey() + " = " + hashValues.getValue());
}
获取 Double 数组中的值并为每个键遍历它。
无需创建新的 4 类。
Number[][] lst = {{1, 3.0, 4.0, 11.0, 443.f}};
或者是这样的:
HashSet<Integer, <ArrayList<Double>> items = new HashSet<Integer, <ArrayList<Double>>();
如果需要混合类型(int/double),那么您将需要一个类。像这样的东西:
public class MapPoints {
private int id;
private double point1;
private double point2;
private double point3;
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setPoint1(double point1) {
this.point1 = point1;
}
public double getPoint1() {
return point1;
}
public void setPoint2(double point2) {
this.point2 = point2;
}
public double getPoint2() {
return point2;
}
public void setPoint3(double point3) {
this.point3 = point3;
}
public double getPoint3() {
return point3;
}
}
如果您只有 3 分,我不明白您为什么还要费心使用数组。这只是引入了 ArrayIndexOutOfBoundsException 的可能性。
之后,您可以只拥有一个 ArrayList 对象来保存所有这些。
但是,如果 ID 可以是浮点数,那么彼得的回答更有意义。
正弦 java 是 OO
public class MyPoint extends Point.Double{
private double z;
public MyPoint(double x, doubley, doublez) {
super(x, y);
this.setZ(z);
}
public double getZ() {
return z;
}
public void setZ(double z) {
this.z = z;
}
public String toString() {
return "MyPoint[" + x + ", " + y + ", " + z + "]";
}
}
我的解决方案将是这样的。
class MyPoint {
int id;
double[] coordinate= new double[3];
MyPoint(int id, double x,double y, double z) {
this.id = id;
coordinate[0]= x;
coordinate[1]= y;
coordinate[2]= z;
}
public int getId() {
return id;
}
public double[] getCoordinate() {
return coordinate;
}
}
class MyPoints extends ArrayList<MyPoint> {
public void addPoint(int id, double x,double y, double z) {
super.add(new MyPoint(id,x,y,z));
}
}
注意:如果需要找到带有id的MyPoint,那么可以使用HashMap;
class MyPointWithHashMap extends HashMap<Integer,MyPoint> {
public void addPoint(int id, double x,double y, double z) {
super.put(id,new MyPoint(id,x,y,z));
}
}
我可能会为您的三点坐标系创建一个包装器类,但不会为包括 ID 在内的整个事物创建一个包装器类。ID 可能应该是单独的,因为它是坐标本身之上的抽象级别。
public class Point {
double x, y, z;
//standard constructors, getters, setters
}
然后,无论您从哪里使用它,您都可以...
HashMap<Integer, Point> map = new HashMap<Integer, Point>();
int id = 0;
...对于您的每一个观点...
map.put(id++, point);
这为您的每个坐标集提供了唯一的 ID,而不是使 ID 成为对象的固有部分。