ich eine Klasse Produkt haben, die drei Variablen:Wie eine Methode compareTo() implementieren, wenn dies mit Gleich und hashcode
class Product implements Comparable<Product>{
private Type type; // Type is an enum
Set<Attribute> attributes; // Attribute is a regular class
ProductName name; // ProductName is another enum
}
I Eklipse verwendet automatisch die gleich() und hashCode() Methoden zu generieren:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((attributes == null) ? 0 : attributes.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Product other = (Product) obj;
if (attributes == null) {
if (other.attributes != null)
return false;
} else if (!attributes.equals(other.attributes))
return false;
if (type != other.type)
return false;
return true;
}
Jetzt in meiner Anwendung brauche ich eine Reihe von Produkt zu sortieren, also muss ich die Schnittstelle Comparable und compareTo-Methode implementieren:
@Override
public int compareTo(Product other){
int diff = type.hashCode() - other.getType().hashCode();
if (diff > 0) {
return 1;
} else if (diff < 0) {
return -1;
}
diff = attributes.hashCode() - other.getAttributes().hashCode();
if (diff > 0) {
return 1;
} else if (diff < 0) {
return -1;
}
return 0;
}
Ist diese Implementierung sinnvoll? Wie wäre es, wenn ich das Produkt nur anhand der String-Werte von "type" - und "attributes" -Werten sortieren möchte? Wie kann man das umsetzen?
Edit: Der Grund, warum ich ein Set von sortieren möchte, ist, weil ich Junit Test habe, der auf den String-Werten eines HashSet behauptet. Mein Ziel ist es, die gleiche Reihenfolge der Ausgabe beizubehalten, wie ich den Satz sortiere. Andernfalls, selbst wenn die Werte des Sets gleich sind, wird die Assertion aufgrund der zufälligen Ausgabe eines Satzes fehlschlagen.
Edit2: Durch die Diskussion ist es klar, dass die Einheit der String-Werte eines HashSet in Unit-Tests nicht gut ist. Für meine Situation schreibe ich im Moment eine sort() -Funktion, um die HashSet-String-Werte in natürlicher Reihenfolge zu sortieren, so dass sie konsistent den gleichen String-Wert für meine Unit-Tests ausgeben kann und das für den Moment ausreicht. Danke allen.
Warum würden Sie ** jemals ** einen hashCode im compareTo verwenden? Macht keinen Sinn. Was müsste nach hashCode sortiert werden? Wie ist das eine "natürliche" Ordnung der Klasse? –
Ok. macht keinen Sinn. Wie implementiert man die natürliche Reihenfolge der Klasse? – user697911
Also, um Ihre Frage zu beantworten, macht keine Ihrer Implementierung absolut keinen Sinn. –