最適化する必要があるケースを知らずに、何を提案すればよいかを知ることは困難です。
たとえば、マップを囲むこの単純なラッパーは、特定のインデックスを設定および取得するために最適化された疎な 2D マトリックスです (「成長」する必要はまったくありません) が、すべてのインデックスを反復処理するには適していません。
public class SparseMatrix<T> {
private final Map<Coordinates, T> map = new HashMap<Coordinates, T>();
private final T defaultValue;
public SparseMatrix(T defaultValue) {
this.defaultValue = defaultValue;
}
private static class Coordinates {
private final int[] coordinates;
Coordinates(int... coordinates) {
this.coordinates = coordinates;
}
@Override
public boolean equals(Object o) {
return Arrays.equals(coordinates, ((Coordinates)o).coordinates);
}
@Override
public int hashCode() {
return Arrays.hashCode(coordinates);
}
}
public T get(int x, int y) {
T value = map.get(new Coordinates(x, y));
if ( value == null ) {
return defaultValue;
}
}
public T set(int x, int y, T val) {
return map.put(new Coordinates(x, y), val);
}
}
使用法:
SparseMatrix<Integer> matrix = new SparseMatrix<Integer>(0);
matrix.set(3, 5, 7);
int seven = matrix.get(3, 5);
int zero = matrix.get(3, 6); //not set yet, uses default
また、N次元にも非常に簡単に適応できます。もちろん、実稼働コードでは、独自のコードを作成するのではなく、より良い仕事をするライブラリを使用します。