Самое быстрое, что я могу придумать, - это сохранить 2D-матрицу этих точек:
//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)
}
Если вам все равно, сколько их будет, просто сработает матрица boolean
. Понятно, что это будет быстро, только если матрица была создана только один раз, и, возможно, будет обновлена по мере добавления Точек в коллекцию.
Короче говоря, базовые Коллекции не идеальны для этого (хотя HashSet
подошел бы близко).
Редактировать
Это может быть легко адаптировано к Set<Point>
, если вы не найдете библиотеку, которая уже делает это для вас. Примерно так:
public class PointSet implements Set<Point> {
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<Point>...
}