私は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 を使用できます。
3 つのポイントが互いに関連している場合は、それらのタイプを導入することを検討し、次のようMyPoints
にルックアップ用にマップに保存します。
Map<Integer, MyPoints> myMap = new HashMap<Integer, MyPoints>
マップが期待どおりに機能するようにhashCode
とequals
メソッドをオーバーライドすることを忘れないでください。つまり、同一のコンテンツを持つ 2 つのインスタンスを等しいと見なします。MyPoints
MyPoint
Map
aを使用し、ID を Key として使用してから、ポイントを含む配列を使用することもできます。
Map<Integer,Double[]> map = new HashMap<Integer,Double[]>();
使用するMap
Map<Integer, Double[]> map = new HashMap<Integer, Double[]>();
したがって、整数 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>>();
私のソリューションはこのようになります。
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));
}
}
3 点座標系のラッパー クラスを作成するかもしれませんが、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 はオブジェクトの固有の部分にはなりません。
モデル クラスを作成して、コントローラ クラスで使用してみませんか? 私はそれが私をはるかに簡単にすると思います。
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);
デフォルトでArrayList
は、値が 1.1、1.2、1.3の が返されます
Guava のバージョン (最新) もここで確認できます。
混合型 (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 が float である可能性がある場合、Peter の答えはより理にかなっています。
サイン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 + "]";
}
}