Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Collection ArrayList und mit erweitertem for iterieren
ich will eine Collection anlegen, diese dann mit int[]-Objekten füllen, immer wenn ein Element aber schon in der Collection ist, soll es nicht nochmal aufgenommen werden. Am Ende will ich meine Collection mit einem erweiterten for ablaufen und mir den Logging-String in einem JOptionPane anzeigen lassen. Leider zeigt es mir immer nur eine Zeile an, obwohl ich rund 5 Einträge erwarte. Mit Collections bin ich noch unerfahren, daher danke für die Rückmeldung.
Java:
// Container anlegen, hier ArrayList
ArrayList<int[]> al = new ArrayList<int[]>( 50 );
int[] currentPoint = new int[2];
for (int lv = 0; lv < leftHullSortedByY.length; lv++ )
{
currentPoint[0] = leftHullSortedByY[lv][0];
currentPoint[1] = leftHullSortedByY[lv][1];
if ( al.contains(currentPoint) == true )
{
continue; // Element ist schon drin
}
else
{
al.add(currentPoint);
}
}
for ( int lv = 0; lv < rightHullSortedByY.length; lv++ )
{
currentPoint[0] = rightHullSortedByY[lv][0];
currentPoint[1] = rightHullSortedByY[lv][1];
if ( al.contains(currentPoint) == true )
{
continue;
}
else
{
al.add(currentPoint);
}
}
String dbgstr = new String("Debugstring setConvexHullPoints\n");
for ( int[] elem : al )
{
dbgstr += "P (" + elem[0] + ", " + elem[1] + ");\n";
}
dbgstr += "-----------------------\n";
JOptionPane.showMessageDialog(null, dbgstr);
Muss die Reihenfolge wählbar sein, oder kann sie auch "fest" ungeordnet oder "fest" sortiert sein? Dann solltest du zu einem Set (Menge) greifen. Da gibt es jedes Element garantiert nur einmal.
Okay, das heisst ich muss mich nicht drum kümmern falls ich doppelte Werte dem Set zufügen will. Ist es ein doppelter, dann wird er implizit nicht aufgenommen?
Eine Klasse java.awt.Point gibt es bereits; vielleicht ist sie genau das, was du als Datenstruktur suchst. Und das nächste, was du wohl brauchst, ist ein java.util.TreeSet, genauer ein TreeSet<Point>. Da ein TreeSet vergleichbare Strukturen braucht, Points aber an sich nicht vergleichbar sind, musst du noch geeignete Comparators schreiben, die du dem TreeSet gibst. Dann sind deine Points im Set garantiert sortiert und kommen auch immer nur einmal vor.
War das jetzt verständlich und zielführend? Oder ist dieser Ansatz völlig ungeeignet?
Leider geht das auch nicht:
Ich nutze gerade ein HashSet und laufe die beiden Zuliefererarrays ab. Der Debugstring sagt mir dann, dass wenn ein Punkt aus dem ersten Zuliefererarray die gleichen Koordinaten hat, wie aus dem zweiten Zuliefererarray, dann ist dieser Punkt zweimal im HashSet. Code ist hier:
Java:
// Container anlegen, hier HashSet
HashSet<int[]> hsc = new HashSet<int[]>();
for ( int lv = 0; lv < leftHullSortedByY.length; lv++ )
{
hsc.add( leftHullSortedByY[lv]);
}
for ( int lv = 0; lv < rightHullSortedByY.length; lv++ )
{
hsc.add( rightHullSortedByY[lv] );
}
String dbgstr = new String("Debugstring setConvexHullPoints\n");
for ( int[] elem : hsc )
{
dbgstr += "P (" + elem[0] + ", " + elem[1] + ");\n";
}
dbgstr += "-----------------------\n";
JOptionPane.showMessageDialog(null, dbgstr);
Bitte beachte die Restriktionen bei der Verwendung von HashSets, insbesondere die korrekte Implementierung von equals() und hashCode().
Aber ich glaube, das jetzt zu erklären oder irgendwie noch mit der Brechstange umzubiegen, wird zu schwierig, darum: Erklär' doch mal, was du erreichen willst.
Bis jetzt weiss ich nicht von welchen Restriktionen du sprichst, Ark, aber das les ich gleich mal nach. Dann zu dem was ich erreichen will.
Ich habe in den Instanzvariablen zwei zweidimensionale Arrays, einmal rightHullPointsSortedByY und einmal leftHullPointsSortedByY. Die Arrays beinhalten Elemente die aus je einem integer-Paar bestehen. Das Paar gibt den x und y-Wert im Koordinatensystem an. Diese beiden Arrays will ich in der Collection bündeln.
Leider sind viele doppelte Werte in den beiden Ausgangsarrays und die muessen raus, dass in der Zielcollection jeder Wert nur einmal vorkommt.
Dann enthält ergebnis alle Punkte aus mengeA und alle Punkte aus mengeB. Die Methoden hashCode() und equals() sind bereits wie benötigt überschrieben. Anstatt mit int[] arbeitest du dann mit Point, ansonsten sollte alles gleich bleiben.