0

我编写了一个程序,其中有 4 个数字。第一个数字是 ID。(int) 其他 3 个只是地图上的点。(双倍的)

我想在它自己的类中创建一个数组数组,理想情况下它存储这 3 个数字并使用第一个作为 ID。

数组列表是一个好方法吗?我真的只是在数据结构上苦苦挣扎。它的本质很简单。我只需要将一堆数字存储在数组数组中。我能做到。但是,将其存储在不同的类中很困难。

4

11 回答 11

3

由于 Java 是一种面向对象的语言,因此只需使用自定义类:

class MyPoint {
  double x, y, z;
}

或者如果你真的需要一个数组

class MyPoint {
  double[] coords;
}

然后它取决于你的 id 是什么,如果它是一个没有“洞”的自动增量值,你可以只拥有一个ArrayList<MyPoint>如果你需要随机访问。

如果它是一个稀疏索引并且您仍然需要随机访问,那么使用HashMap<Integer, MyPoint>. TreeMap<Integer, MyPoint>如果您需要对它们进行排序(按 id 或按位置),则可以使用 a 。

于 2012-10-22T15:32:10.543 回答
1

如果这三个点彼此相关,请考虑为它们引入一种类型,例如MyPoints并将它们存储在地图中以进行查找,如下所示:

Map<Integer, MyPoints> myMap = new HashMap<Integer, MyPoints>

请记住覆盖hashCodeequals方法以MyPoints使地图按预期运行,即考虑两个MyPoint具有相同内容的实例相等。

于 2012-10-22T15:34:01.393 回答
1

您也可以使用 aMap并将您的 id 用作键,然后使用带有您的点的数组。

Map<Integer,Double[]> map = new HashMap<Integer,Double[]>();
于 2012-10-22T15:34:28.947 回答
0

你为什么不创建一个模型类并在你的控制器类中使用它呢?我想这会让我轻松很多。

class SomeModel {
    // getters and setters }


class Controller {
   public SomeModel model;

   //getter and setter for model
   }
于 2012-10-22T15:43:19.323 回答
0

为什么不使用MultiMapApache 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 版本(最新):

http://guava-libraries.googlecode.com/svn/tags/release03/javadoc/com/google/common/collect/Multimap.html

于 2012-10-22T15:43:49.490 回答
0

利用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 数组中的值并为每个键遍历它。

于 2012-10-22T16:47:57.317 回答
0

无需创建新的 4 类。

Number[][] lst = {{1, 3.0, 4.0, 11.0, 443.f}};

或者是这样的:

HashSet<Integer, <ArrayList<Double>> items = new HashSet<Integer, <ArrayList<Double>>();
于 2012-10-22T15:31:02.533 回答
0

如果需要混合类型(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 可以是浮点数,那么彼得的回答更有意义。

于 2012-10-22T15:45:28.200 回答
0

正弦 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 + "]";
    }

}
于 2012-10-22T16:08:16.790 回答
0

我的解决方案将是这样的。

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));
    }
}
于 2012-10-22T15:34:36.107 回答
0

我可能会为您的三点坐标系创建一个包装器类,但不会为包括 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 成为对象的固有部分。

于 2012-10-22T15:37:36.887 回答