Абсолютное быстро я могу думать о том, чтобы поддерживать матрицу 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
матрица будет работать. Ясно, что это было бы быстро, если бы матрица была создана только один раз и, возможно, обновлена, поскольку Points добавлены в коллекцию.
Короче говоря, основные коллекции не идеальны для этого (хотя приблизился бы 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>...
}
они целые или плавающие? – Jack