我能想到的绝对最快的是维持这些点的二维矩阵:
//just once
int[][] occurrences = new int[X_MAX][Y_MAX];
for (Point p : points ) {
occurrences[p.x][p.y]++;
}
//sometime later
if ( occurrences[x][y] != 0 ) {
//contains Point(x, y)
}
如果你不关心有多少,只需一个布尔矩阵即可.显然,如果矩阵只创建一次,这种情况就会很快,并且可能会在将点添加到集合中时更新.
简而言之,基本的集合并不是完美的(尽管HashSet会很接近).
编辑
这可以很容易地适应于Set< Point>.如果你找不到一个为你做这个的库.像这样的东西:
public class PointSet implements Set {
private final boolean[][] data;
public PointSet(int xSize, int ySize) {
data = new boolean[xSize][ySize];
}
@Override
public boolean add(Point e) {
boolean hadIt = data[e.x][e.y];
data[e.x][e.y] = true;
return hadIt;
}
@Override
public boolean contains(Object o) {
Point p = (Point) o;
return data[p.x][p.y];
}
//...other methods of Set...
}