D
						
					
					
						
					
				
				
					Ich würde es ungefähr so lösen (denke, es ist ähnlich zu Siasseis Ansatz):
public interface PointIterator {
    boolean next(double[] data);
}
public abstract class AbstractPointIterator implements PointIterator {
    private double[] data;
    private int pointSize;
    private int count;
    private int pos;
    public AbstractPointIterator(double[] data, int pointSize) {
        this.data = data;
        this.pointSize = pointSize;
        this.count = data.length / pointSize;
        this.pos = 0;
    }
    public boolean next(double[] output) {
        if (pos < count) {
            createPoint(data, output, count, pointSize, pos);
            pos++;
            return true;
        }
        return false;
    }
    protected abstract void createPoint(double[] data, double[] output, int count, int pointSize, int pos);
}
public class InterleavedPointIterator extends AbstractPointIterator {
    public InterleavedPointIterator(double[] data, int pointSize) {
        super(data, pointSize);
    }
    @Override
    protected void createPoint(double[] data, double[] output, int count, int pointSize, int pos) {
        for (int i = 0; i < pointSize; i++) {
            output[i] = data[pos * pointSize + i];
        }
    }
}
public class NonInterleavedPointIterator extends AbstractPointIterator {
    public NonInterleavedPointIterator(double[] data, int pointSize) {
        super(data, pointSize);
    }
    @Override
    protected void createPoint(double[] data, double[] output, int count, int pointSize, int pos) {
        for (int i = 0; i < pointSize; i++) {
            output[i] = data[i * count + pos];
        }
    }
}
public void calculate(double[] data, int pointSize, boolean interleaved) {
    PointIterator it =
            (interleaved) ? new InterleavedPointIterator(data, pointSize)
                          : new NonInterleavedPointIterator(data, pointSize);
    double[] point = new double[pointSize];
    while (it.next(point)) {
        // ... calculate with point
    }
}
Augenmerk liegt dabei auf folgenden Punkten:
Kein Speicherkopieren und keine neuen Objekte erstellen während berechnet wird
Demonstration interleaved vs. non-interleaved
Flexibel - kann genauso auch mit einer Liste von Points oder ähnlichem arbeiten
Flexible Größe der Punkte - wenn die immer 3 ist, kann man das auch fest reinkodieren.
Um einen "echten" objektorientierten Ansatz wird man - wie auch schon erwähnt - bei Java nicht herumkommen.