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.