Eclipse Kepler SR 1 auf OS X 9.2
Hallo,
wir haben eine Klasse Dataset die Einen Calendar und ein paar Floats hält, also nichts wildes.
Der Comparator für diese Datasets sieht so aus und soll nach dem Datum im Calendar ordnen.:
Von dieser Klasse haben wir einen TreeSet angelegt. Beim Einfügen eines DataSets in den TreeSet mit add scheint der Comparator nicht richtig zu greifen. Das ganze läuft in einer Schleife. Mit i zähle ich die Schleifendurchläufe.
gibt brav "1 DS vor: 20.8.2013;20.0;8.09;7.77;7.94" aus.
Nun kommt das Ding in den TreeSet:
und ich lese den TreeSet aus:
Beim ersten zufügen geht alles gut.
[20.8.2013;20.0;8.09;7.77;7.94]------1 Commerzbank, also genau wie der Dataset vor dem add...
Im zweiten Schleifendurchlauf kommt nun der nächste Dataset:
2 DS vor: 19.8.2013;19.0;8.55;8.1;8.15
nach dem add steht nun aber im Dataset:
[19.8.2013;20.0;8.09;7.77;7.94]------2 Commerzbank
Es hat sich also nur das Datum vorne geändert, aber die floats sind gleich geblieben.
Wenn ich mir im Comparator die beiden Eingangsobjekte anschaue ist dort schon das gleiche Problem:
Comp: 19.8.2013;19.0;8.55;8.1;8.15 19.8.2013;20.0;8.09;7.77;7.94
Damit fällt der Comparator auf die Nase, nimmt für die eigentlich verschiednen Objekte das gleiche (falsche) Datum an and gibt zurück, dass die Objekte anhand des Datums gleich sind. So wird das Dataset also nicht in den TreeSet gepackt.
Hat jemand eine Idee, was da falsch läuft?
Danke vielmals
Oliver
Hallo,
wir haben eine Klasse Dataset die Einen Calendar und ein paar Floats hält, also nichts wildes.
Java:
import java.util.*;
/*Diese Klasse repräsentiert eine Datenstruktur, die relevante Werte einer Aktie bezogen auf einen Tag zusammenfasst. Es sollen folgende Werte erfasst werden:
Datum (date), Eröffnungskurs (open), Höchstwert (high), Tiefstwert (low), Endkurs (close)*/
public class Dataset {
//Initialisierung der Klasse mit den übergebenen Werten bei Erstellung einer neuen Instanz
public Dataset(Calendar date, double open, double high, double low, double close){
this.date = date;
this.open = open;
this.high = high;
this.low = low;
this.close = close;
}
//Deklaration der Variablen
Calendar date;
double open;
double high;
double low;
double close;
//Liefert eine Kopie des Datums
public Calendar getDate() {
Calendar datecopy = (Calendar) date.clone();
return datecopy;
}
//Liefert den Eröffnungswert
public double getOpen() {
return open;
}
//Liefert den Höchstwert
public double getHigh() {
return high;
}
//Liefert den Tiefstwert
public double getLow() {
return low;
}
//Liefert den Tagesendwert
public double getClose() {
return close;
}
//Vergleicht zwei Objekte Dataset Instanzen miteinander.
public boolean equals(Dataset other){
if (
(date.get(Calendar.DAY_OF_MONTH) == other.date.get(Calendar.DAY_OF_MONTH))&&
(date.get(Calendar.MONTH) == other.date.get(Calendar.MONTH))&&
(date.get(Calendar.YEAR) == other.date.get(Calendar.YEAR))&&
(open == other.open) &&
(high == other.high) &&
(low == other.low) &&
(close == other.close))
return true;
else return false;
}
//Anpassung der hashCode Funktion an die equals Funktion
public int hashCode() {
int hc = 17;
hc = hc + date.get(Calendar.DAY_OF_MONTH);
hc = hc + date.get(Calendar.MONTH);
hc = hc + date.get(Calendar.YEAR);
long temp = ((open == 0.0) ? 0L: Double.doubleToLongBits(open));
hc = hc + (int) (temp ^ (temp >>> 32));
temp = ((high == 0.0) ? 0L: Double.doubleToLongBits(high));
hc = hc + (int) (temp ^ (temp >>> 32));
temp = ((low == 0.0) ? 0L: Double.doubleToLongBits(low));
hc = hc + (int) (temp ^ (temp >>> 32));
temp = ((close == 0.0) ? 0L: Double.doubleToLongBits(close));
hc = hc + (int) (temp ^ (temp >>> 32));
return hc;
}
//Liefert eine Textrepräsentation des Datensatzes
public String toString() {
return date.get(Calendar.DAY_OF_MONTH)+"."+(date.get(Calendar.MONTH)+1)+"."+date.get(Calendar.YEAR)+";" + open+";"+high+";"+low+";"+close;
}
}
Der Comparator für diese Datasets sieht so aus und soll nach dem Datum im Calendar ordnen.:
Java:
public class DatasetComparator implements Comparator<Dataset>{
@Override public int compare (Dataset D1, Dataset D2)
{//System.out.println("Comp: "+D1+" "+D2);
if (D1.date.after(D2.date)) { return -1;}
if (D1.date.before(D2.date)) {return 1;}
else {return 0;}
}
}
Von dieser Klasse haben wir einen TreeSet angelegt. Beim Einfügen eines DataSets in den TreeSet mit add scheint der Comparator nicht richtig zu greifen. Das ganze läuft in einer Schleife. Mit i zähle ich die Schleifendurchläufe.
Java:
//Dataset bauen
Dataset DS = new Dataset (cal, open, high, low, close);
//TreeSet der datasets bauen
System.out.println(i+" DS vor: "+DS);
gibt brav "1 DS vor: 20.8.2013;20.0;8.09;7.77;7.94" aus.
Nun kommt das Ding in den TreeSet:
Java:
datasets.add(DS);
und ich lese den TreeSet aus:
Java:
System.out.println(datasets+"------"+i+" "+Name);
Beim ersten zufügen geht alles gut.
[20.8.2013;20.0;8.09;7.77;7.94]------1 Commerzbank, also genau wie der Dataset vor dem add...
Im zweiten Schleifendurchlauf kommt nun der nächste Dataset:
2 DS vor: 19.8.2013;19.0;8.55;8.1;8.15
nach dem add steht nun aber im Dataset:
[19.8.2013;20.0;8.09;7.77;7.94]------2 Commerzbank
Es hat sich also nur das Datum vorne geändert, aber die floats sind gleich geblieben.
Wenn ich mir im Comparator die beiden Eingangsobjekte anschaue ist dort schon das gleiche Problem:
Comp: 19.8.2013;19.0;8.55;8.1;8.15 19.8.2013;20.0;8.09;7.77;7.94
Damit fällt der Comparator auf die Nase, nimmt für die eigentlich verschiednen Objekte das gleiche (falsche) Datum an and gibt zurück, dass die Objekte anhand des Datums gleich sind. So wird das Dataset also nicht in den TreeSet gepackt.
Hat jemand eine Idee, was da falsch läuft?
Danke vielmals
Oliver