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.
Nur so ne Idee: was haltet ihr von einer SortKey?
Das hat natürlich den Nachteil, daß es mehr Speicherplatz braucht, aber ich find's irgendwie übersichtlicher
und der Comparator wird ja dann auch unabhängiger vom Objekt (als Beispiel hier die Person):
Code:
...
Collections.sort(vector, new Comparator<Person>() {
public int compare(Person p1, Person p2) {
return p1.getSortKey().compareTo(p2.getSortKey());
}
});
...
class Person{
private String vorn, name, firm, sKey;
final private String SP = " ";
public Person(final String vornP, final String nameP, final String firmP){
if(vornP==null || nameP==null || firmP==null)
throw new NullPointerException();
if(vornP.length()>SP.length() || nameP.length()>SP.length() || firmP.length()>SP.length())
throw new IllegalArgumentException();
vorn = vornP;
name = nameP;
firm = firmP;
sKey = buildSortKey();
}
public String getFirma() {return firm;}
public String getName() {return name;}
public String getVorname() {return vorn;}
public String getSortKey() {return sKey;}
public String toString() {return firm+"_"+name+"_"+vorn;}
private String buildSortKey() {
StringBuilder buildKey = new StringBuilder();
buildKey.append(firm);
buildKey.append(SP.substring(firm.length()));
buildKey.append(name);
buildKey.append(SP.substring(name.length()));
buildKey.append(vorn);
buildKey.append(SP.substring(vorn.length()));
return buildKey.toString();
}
}
Nur so ne Idee: was haltet ihr von einer SortKey?
Das hat natürlich den Nachteil, daß es mehr Speicherplatz braucht, aber ich find's irgendwie übersichtlicher
und der Comparator wird ja dann auch unabhängiger vom Objekt (als Beispiel hier die Person):
Dann doch lieber Comparable implementieren (gleicher Aufwand, ohne die Datenmenge zu verdoppeln).
Möchte man aber nach verschiedenen Kriterien sortieren, sind Comparatoren ausserhalb der Klasse besser.
genauso könnte man mehrere Comparatoren implementieren. Der Aufwand bleibt gleich, die Datenmenge
wird aber nicht verlielfacht, nur für den Fall, dass man irgendwo Vergleichmöglichkeiten braucht.
Ich persönlich würde es lieber trennen.
Je mehr ich darüber nachdenke, desto mehr schwinden die "Vorteile" einer einer SortKey
An Performanz gewinnt man wahrscheinlich auch nichts.
Naja, die Väter von Java haben sich das schon gut ausgedacht
Je mehr ich darüber nachdenke, desto mehr schwinden die "Vorteile" einer einer SortKey
An Performanz gewinnt man wahrscheinlich auch nichts.
Naja, die Väter von Java haben sich das schon gut ausgedacht
Übrigens, man könnte es auch per Reflection machen (sieht aber sch... aus )
Verwendung
Code:
Collections.sort(personList, new GenericComparator( Person.class, new String[] { "nachname", "vorname" }));
Collections.sort(adressList, new GenericComparator( Adresse.class, new String[] { "ort", "strasse" }));
Implementierung (so auf die Schnelle zusammengetippt, Fehler nicht ausgeschlossen und Code potthässlich :wink: )
Code:
class GenericComparator<TValueType> implements Comparator<TValueType>
{
private Method getterList[];
public GenericComparator(Class<TValueType> clazz, String properties[])
{
getterList = new Method[properties.length];
try
{
// TODO: Code zu hässlich
BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
PropertyDescriptor props[] = beanInfo.getPropertyDescriptors();
int i=0;
for(String property : properties)
{
for(PropertyDescriptor descriptor : props)
{
if(descriptor.getName().equals(property))
{
getterList[i++] = descriptor.getReadMethod();
break;
}
}
// TODO: Wenn Property nicht gefunden wird, laut schreien
}
}
catch (IntrospectionException e)
{
// TODO: e.printStackTrace() ist keine Fehlerbehandlung
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public int compare(TValueType v1, TValueType v2)
{
int result = 0;
for(Method getter : getterList)
{
try
{
// TODO: ACHTUNG! Hier gehe ich davon aus, dass alles Comparable ist und nicht null!
result = ((Comparable)getter.invoke(v1, (Object[])null)).compareTo(getter.invoke(v2, (Object[])null));
}
catch (IllegalArgumentException e)
{
// TODO: e.printStackTrace() ist keine Fehlerbehandlung
e.printStackTrace();
}
catch (IllegalAccessException e)
{
// TODO: e.printStackTrace() ist keine Fehlerbehandlung
e.printStackTrace();
}
catch (InvocationTargetException e)
{
// TODO: e.printStackTrace() ist keine Fehlerbehandlung
e.printStackTrace();
}
if(result != 0)
{
break;
}
}
return result;
}
}