Hi ihr alle...
ich habe einen quicksort für mein jtable eingebaut und es läuft und läuft einfach nicht rund...
es handelt sich um ein filetable. das tableModel besitzt das attribut files und indexes. files und indexes sind beide vom typ "List". die reihenfolge der files ändert sich nie. über die indexes verwalte ich die zuordnung zw. files und angezeigter reihenfolge in der tabelle...
ich kann leider nicht genau sagen wo der fehler liegt...es ist mir aber allerdings aufgefallen, dass wenn die sortierung von z -> a vorliegt der untere teil (also der bei der ersten aufteilung im quicksort) stimmt. der obere teil stimmt eigentlich auch, nur ist der in die andere richtung sortiert...
d.h. bei einer liste 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
würde bei mir quasi folgendes rauskommen wenn ich absteigend sortiere:
6, 7, 8, 9, 10, 5, 4, 3, 2, 1
es kann eigentlich nur eine kleinigkeit sein...aber ich finds nicht...sitze wohl schon zu lange davor
lg dennis
ich habe einen quicksort für mein jtable eingebaut und es läuft und läuft einfach nicht rund...
es handelt sich um ein filetable. das tableModel besitzt das attribut files und indexes. files und indexes sind beide vom typ "List". die reihenfolge der files ändert sich nie. über die indexes verwalte ich die zuordnung zw. files und angezeigter reihenfolge in der tabelle...
Code:
class XsFileTableSorter extends MouseAdapter implements TableModelListener {
List<Integer> indexes = new ArrayList<Integer>();
List<Integer> sortingColumns = new ArrayList<Integer>();
List sortingDesc = new ArrayList();
XsFileTable table;
public XsFileTableSorter() {
}
public void mouseClicked(MouseEvent e) {
TableColumnModel columnModel = table.getColumnModel();
int viewColumn = columnModel.getColumnIndexAtX(e.getX());
int sortColumn = table.convertColumnIndexToModel(viewColumn);
reallocateIndexes();
if (e.getClickCount() == 1 && sortColumn != -1) {
int shiftPressed = e.getModifiers()&InputEvent.SHIFT_MASK;
int sortedColumnIndex = sortingColumns.indexOf(sortColumn);
if(sortedColumnIndex == -1) {
if (shiftPressed == 0) {
sortingColumns.clear();
sortingDesc.clear();
}
sortingColumns.add(sortColumn);
sortingDesc.add(new Boolean(true));
} else {
if (shiftPressed == 0) {
boolean tmp = !(Boolean) sortingDesc.get(sortedColumnIndex);
sortingColumns.clear();
sortingDesc.clear();
sortingColumns.add(sortColumn);
sortingDesc.add(tmp);
} else {
sortingDesc.set(sortedColumnIndex, (!(Boolean) sortingDesc.get(sortedColumnIndex)));
}
}
sortByColumns();
}
}
public void tableChanged(TableModelEvent tableModelEvent) {
reallocateIndexes();
sortByColumns();
System.out.println("tableChanged");
}
public void setTable(JTable p_table) {
table = (XsFileTable) p_table;
reallocateIndexes();
}
public void sortByColumns() {
for(int index=0;index<sortingColumns.size();index++) {
quicksort((Integer) sortingColumns.get(index), (Boolean) sortingDesc.get(index), 0, this.indexes.size()-1);
}
}
public void reallocateIndexes() {
int rowCount = table.getModel().getRowCount();
this.indexes.clear();
for (int row = 0; row < rowCount; row++) {
this.indexes.add(row);
}
((FolderTableModel) table.getModel()).setIndexes(this.indexes);
}
private void quicksort(int column, boolean desc, int lo, int hi) {
int i = lo, j = hi;
while (i <= j) {
if(desc)
while (compareRowsByColumn(this.indexes.get(i), this.indexes.get((lo + hi) / 2), column) > 0)
i++;
else
while (compareRowsByColumn(this.indexes.get(i), this.indexes.get((lo + hi) / 2), column) < 0)
i++;
if(desc)
while (compareRowsByColumn(this.indexes.get(j), this.indexes.get((lo + hi) / 2), column) < 0)
j--;
else
while (compareRowsByColumn(this.indexes.get(j), this.indexes.get((lo + hi) / 2), column) > 0)
j--;
//wenn i kleiner als j ist wird getauscht
if (i <= j) {
swap(i, j);
i++;
j--;
}
}
// Rekursion
if (lo < j)
quicksort(column, desc, lo, j);
if (i < hi)
quicksort(column, desc, i, hi);
}
public void swap(int i, int j) {
int tmp = this.indexes.get(i);
this.indexes.set(i, this.indexes.get(j));
this.indexes.set(j, tmp);
((FolderTableModel) table.getModel()).setIndexes(this.indexes);
}
public int compareRowsByColumn(int row1, int row2, int column) {
Class type = table.getModel().getColumnClass(column);
TableModel data = table.getModel();
Object o1 = data.getValueAt(row1, column);
Object o2 = data.getValueAt(row2, column);
if (o1 == null && o2 == null) {
return 0;
} else if (o1 == null) { // Define null less than everything.
return -1;
} else if (o2 == null) {
return 1;
}
if (type == String.class) {
String s1 = (String)data.getValueAt(row1, column);
String s2 = (String)data.getValueAt(row2, column);
int result = s1.compareTo(s2);
return result;
}
}
ich kann leider nicht genau sagen wo der fehler liegt...es ist mir aber allerdings aufgefallen, dass wenn die sortierung von z -> a vorliegt der untere teil (also der bei der ersten aufteilung im quicksort) stimmt. der obere teil stimmt eigentlich auch, nur ist der in die andere richtung sortiert...
d.h. bei einer liste 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
würde bei mir quasi folgendes rauskommen wenn ich absteigend sortiere:
6, 7, 8, 9, 10, 5, 4, 3, 2, 1
es kann eigentlich nur eine kleinigkeit sein...aber ich finds nicht...sitze wohl schon zu lange davor
lg dennis