整数格子上の点を表す Point クラスを定義しました。hashCode() と equals(Object) のメソッドをオーバーライドしました。
座標値 >= 128 のポイントに対して HashMap.put(Point, Double) を使用すると、HashMap は何もしないようです。エラーはスローされませんが、HashMap からポイントにアクセスしようとすると、キーが見つからないという結果になります。私は INTEGER.MAX_VALUE を十分に下回っており、十分なメモリを利用できます。
ここに私のポイントクラスがあります:
import java.util.ArrayList;
public class Point {
protected int dimension;
protected ArrayList<Integer> coordinates;
public Point(int[] coordinates){
this.coordinates = convertArray(coordinates);
dimension = coordinates.length;
}
private ArrayList<Integer> convertArray(int[] array){
ArrayList<Integer> newArray = new ArrayList<Integer>();
for(int i = 0; i < array.length; i++){
newArray.add(array[i]);
}
return newArray;
}
@Override
public int hashCode(){
// Some arbitrary quick hash
return coordinates.get(0);
}
@Override
public boolean equals(Object o){
Point p = (Point)o;
if(dimension != p.coordinates.size())
return false;
for(int i = 0; i < p.coordinates.size(); i++){
if(coordinates.get(i) != p.coordinates.get(i)){
return false;
}
}
return true;
}
}
そして私が実行したテスト:
import java.util.*;
public class random {
public static void main(String[] args) {
HashMap<Point, Double> weight = new HashMap<Point, Double>((int)(150 * 150 * .75 + 1));
for(int i = 0; i < 150; i++){
for(int j = 0; j < 150; j++){
int [] tmpArray = {i, j};
weight.put(new Point(tmpArray), Math.random());
}
}
for(int i = 0; i < 150; i++){
for(int j = 0; j < 150; j++){
int [] tmpArray = {i, j};
if(weight.get(new Point(tmpArray)) == null){
System.out.println("[" + i + ", " + j + "]: ");
System.out.println(weight.containsKey(new Point(tmpArray)));
}
}
}
}
}
どんなアイデアでも役に立ちます。ありがとう!