// If both values are null return 0 if (o1 == null && o2 == null) {
return 0;
} elseif (o1 == null) { // Define null less than everything.
return -1;
} elseif (o2 == null) {
return 1;
}
/* We copy all returned values from the getValue call in case anoptimisedmodelisreusingoneobjecttoreturnmanyvalues. TheNumbersubclassesintheJDKareimmutableandsowillnotbeused inthiswaybutothersubclassesofNumbermightwanttodothistosave spaceandavoidunnecessaryheapallocation.
*/ if (type.getSuperclass() == java.lang.Number.class) {
Number n1 = (Number) data.getValueAt(row1, column); double d1 = n1.doubleValue();
Number n2 = (Number) data.getValueAt(row2, column); double d2 = n2.doubleValue();
if (d1 < d2) {
return -1;
} elseif (d1 > d2) {
return 1;
} else {
return 0;
}
} elseif (type == java.util.Date.class) {
Date d1 = (Date) data.getValueAt(row1, column); long n1 = d1.getTime();
Date d2 = (Date) data.getValueAt(row2, column); long n2 = d2.getTime();
publicvoid n2sort() { for (int i = 0; i < getRowCount(); i++) { for (int j = i + 1; j < getRowCount(); j++) { if (compare(indexes[i], indexes[j]) == -1) {
swap(i, j);
}
}
}
}
// This is a home-grown implementation which we have not had time // to research - it may perform poorly in some circumstances. It // requires twice the space of an in-place algorithm and makes // NlogN assigments shuttling the values between the two // arrays. The number of compares appears to vary between N-1 and // NlogN depending on the initial order but the main reason for // using it here is that, unlike qsort, it is stable. publicvoid shuttlesort(int[] from, int[] to, int low, int high) { if (high - low < 2) {
return;
} int middle = (low + high) / 2;
shuttlesort(to, from, low, middle);
shuttlesort(to, from, middle, high);
int p = low; int q = middle;
/* This is an optional short-cut; at each recursive call, checktoseeiftheelementsinthissubsetarealready ordered.Ifso,nofurthercomparisonsareneeded;the sub-arraycanjustbecopied.Thearraymustbecopiedrather thanassignedotherwisesistercallsintherecursionmight getoutofsinc.Whenthenumberofelementsisthreethey arepartitionedsothatthefirstset,[low,mid),hasone elementandthesecond,[mid,high),hastwo.Weskipthe optimisationwhenthenumberofelementsisthreeorlessas thefirstcompareinthenormalmergewillproducethesame sequenceofsteps.Thisoptimisationseemstobeworthwhile forpartiallyorderedlistsbutsomeanalysisisneededto findouthowtheperformancedropstoNlog(N)astheinitial
order diminishes - it may drop very quickly. */
if (high - low >= 4 && compare(from[middle - 1], from[middle]) <= 0) {
System.arraycopy(from, low, to, low, high - low);
return;
}
// A normal merge.
for (int i = low; i < high; i++) { if (q >= high || (p < middle && compare(from[p], from[q]) <= 0)) {
to[i] = from[p++];
} else {
to[i] = from[q++];
}
}
}
publicvoid swap(int i, int j) { int tmp = indexes[i];
indexes[i] = indexes[j];
indexes[j] = tmp;
}
// The mapping only affects the contents of the data rows. // Pass all requests to these rows through the mapping array: "indexes".
@Override public Object getValueAt(int aRow, int aColumn) {
checkModel();
return model.getValueAt(indexes[aRow], aColumn);
}
@Override publicvoid setValueAt(Object aValue, int aRow, int aColumn) {
checkModel();
model.setValueAt(aValue, indexes[aRow], aColumn);
}
// There is no-where else to put this. // Add a mouse listener to the Table to trigger a table sort // when a column heading is clicked in the JTable. publicvoid addMouseListenerToHeaderInTable(JTable table) { final TableSorter sorter = this; final JTable tableView = table;
tableView.setColumnSelectionAllowed(false);
MouseAdapter listMouseListener = new MouseAdapter() {
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.