Auch wenn die grundlegende Diskussion um die List herum noch (oder doch nicht mehr?) im Gange ist, wollte ich mal fragen, welche Gedanken es zu “Set” gibt.
Der Anlass ist, dass ich da schonmal drüber nachgedacht hatte, und eben auf Umwegen wieder drüber gestolpert bin. Damals war meine Intention, etwas zu machen, was einer mathematischen Menge möglichst nahe kommt (aber trotzdem noch einigermaßen vernünftig verwendbar ist). Das ist weitaus schwieriger, als man im ersten Moment meinen würde. Manche Sachen sind straightforward:
public interface MathSet<T>
{
boolean contains(Object object);
}
// ( ^Das war's dann aber auch schon...)
public interface CartesianProductMathSet<X, Y> extends MathSet<Tuple2<X, Y>>
{
MathSet<? extends X> getMathSetX();
MathSet<? extends Y> getMathSetY();
}
...
Ein paar nahe liegende Implementierungen dazu…
class DifferenceMathSet<T> implements MathSet<T>
{
...
@Override
public boolean contains(Object object)
{
return s0.contains(object) && !s1.contains(object);
}
}
class IntegerNumbersRange implements MathSet<Integer>
{
private final int min;
private final int max;
...
}
Aber das ist natürlich nicht unzureichend. Für eine Interoperation mit java.util.Set
bräuchte man zumindest noch eine Implementierung von Iterable
. Das funktioniert auch ganz gut…
public interface EnumerableMathSet<T> extends MathSet<T>, Iterable<T>
{
...
}
class IntegerNumbersRange implements EnumerableMathSet<Integer>
{
...
}
Das führt aber irgendwann zur (schon fast “üblichen”) kombinatorischen Explosion von Eigenschaften (ImplicitEnumerableIntersectionMathSet
und DefaultEnumerableCartesianProductMathSet
poste ich jetzt mal nicht :rolleyes: ).
Die Eigenschaften geeignet und stimmig abzubilden ist ziemlich schwierig. Im speziellen wäre eine size()
-Methode eben oft praktisch. Beim IntegerNumbersRange
ist sie noch straightforward, beim DoubleNumbersRange
schon nicht mehr. Vom size
eines DifferenceMathSet
oder gar der Frage nach einer geeigneten Implementierung von equals
mal ganz abgesehen:
Range.of(0,10).union(Range.of(5,15)).equals(Range.of(0,15));
? Nie und nimmer…
Das sind nur erste (alte) Gedanken, die mit neco4j eigentlich nichts zu tun haben. Aber vielleicht ist eine Rechtfertigung dafür, das anzusprechen, ja zumindest die, dass Überlegungen zu “anderen Datenstrukturen als List” auch Einfluss auf List haben könnten…