Re: Comparable loses its interface powers.
In article <c6m9o51jf2i3569t6v5l6ucoiek23hbef7@4ax.com>,
Roedy Green <see_website@mindprod.com.invalid> wrote:
But generics butt in and it seems to be impossible to keep around
arrays of Comparables for sorting columns.
I came up with this scheme for a type-safe Comparator<Record>. It lets
the compiler catch a Field that isn't Comparable:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/** @author John B. Matthews */
public class ComparatorTest {
public static void main(String[] args) {
List<Record> list = new ArrayList<Record>(Arrays.asList(
new Record(99, "Xxx"),
new Record(56, "Yyy"),
new Record(42, "Zzz")));
print(list, Sort.ASCENDING, Field.I);
print(list, Sort.DESCENDING, Field.S);
}
private static void print(List<Record> list, Sort s, Field f) {
RecordComparator rc = new RecordComparator(s, f);
Collections.sort(list, rc);
for (Record r : list) {
System.out.println(r);
}
}
}
class Record {
private Integer i;
private String s;
public Record(Integer i, String s) {
this.i = i;
this.s = s;
}
@Override
public String toString() {
return i + " " + s;
}
public int compareTo(Field field, Record record) {
switch (field) {
case I: return this.i.compareTo(record.i);
case S: return this.s.compareTo(record.s);
default: throw new IllegalArgumentException(
"Unable to sort Records by " + field.getType());
}
}
}
enum Sort { ASCENDING, DESCENDING; }
enum Field {
I(Integer.class), S(String.class);
private Class type;
Field(Class<? extends Comparable> type) {
this.type = type;
}
public Class getType() {
return type;
}
}
class RecordComparator implements Comparator<Record> {
private Field field;
private Sort sort;
public RecordComparator(Sort sort, Field field) {
this.sort = sort;
this.field = field;
}
@Override
public final int compare(Record a, Record b) {
int result = a.compareTo(field, b);
if (sort == Sort.ASCENDING) return result;
else return -result;
}
}
--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>