Сортировка числовых значений TableSorter - PullRequest
0 голосов
/ 19 мая 2011

Поскольку я использую Java 1.4.2, это означает, что я не могу использовать реализацию сортировщика таблиц в Java. Вместо этого я использовал класс TableSorter.java из предыдущего ответа на мой предыдущий пост: Главы по реализации roworter и rowfilter java 1.4

Однако он отлично работает с одной проблемой, которая заключается в том, что он неправильно сортирует числовые значения. Например, у меня есть следующая последовательность чисел в моей таблице: 5,18,9,7,2,33

Сортировка по возрастанию будет отображать их в моем JTable следующим образом:

18,2,33,5,7,9

Сортировка по убыванию показала бы их в моем JTable следующим образом: 9,7,5,33,2,18

Я не знаю, осознали ли вы это, но, очевидно, сортировка числовых значений происходит только по первой цифре.

У вас есть быстрое решение проблемы? Пожалуйста, помните, что эти числовые значения используются в качестве строки в моей JTable, как предложено методом getValue ().

Ответы [ 3 ]

2 голосов
/ 19 мая 2011

Убедитесь, что getColumnClass() возвращает числовой тип, например Number.

Приложение: MyTableModel в TableSorterDemo является примером. Данные для третьего столбца имеют тип Integer, подкласс Number; в результате getColumnClass() возвращает Integer.class. Поскольку Integer реализует Comparable, столбец отсортирован по номерам.

1 голос
/ 19 мая 2011

Вам необходимо реализовать Comparator, который выполняет числовое сравнение, а не лексикографическое по умолчанию.Так что-то вроде (взято из http://crossedlogic.blogspot.com/2008/11/java-custom-comparators-sorting-text.html):

Comparator c1 = new java.util.Comparator() {
        /**
         * Custom compare to sort numbers as numbers.
         * Strings as strings, with numbers ordered before strings.
         * 
         * @param o1
         * @param o2
         * @return
         */
@Override
            public int compare(Object oo1, Object oo2) {
                boolean isFirstNumeric, isSecondNumeric;
                String o1 = oo1.toString(), o2 = oo2.toString();


            isFirstNumeric = o1.matches("\\d+");
            isSecondNumeric = o2.matches("\\d+");

            if (isFirstNumeric) {
                if (isSecondNumeric) {
                    return Integer.valueOf(o1).compareTo(Integer.valueOf(o2));
                } else {
                    return -1; // numbers always smaller than letters
                }
            } else {
                if (isSecondNumeric) {
                    return 1; // numbers always smaller than letters
                } else {
                    isFirstNumeric = o1.split("[^0-9]")[0].matches("\\d+");
                    isSecondNumeric = o2.split("[^0-9]")[0].matches("\\d+");

                    if (isFirstNumeric) {
                        if (isSecondNumeric) {
                            int intCompare = Integer.valueOf(o1.split("[^0-9]")[0]).compareTo(Integer.valueOf(o2.split("[^0-9]")[0]));
                            if (intCompare == 0) {
                                return o1.compareToIgnoreCase(o2);
                            }
                            return intCompare;
                        } else {
                            return -1; // numbers always smaller than letters
                        }
                    } else {
                        if (isSecondNumeric) {
                            return 1; // numbers always smaller than letters
                        } else {
                            return o1.compareToIgnoreCase(o2);
                        }
                    }
                }
            }
        }
    };

, а затем передать это в качестве компаратора для столбца:

tblSorter.setColumnComparator(String.class, c1);

Дайте мне знать, как это работает.

0 голосов
/ 19 мая 2011

Чтобы проинформировать вас об этом, я заменил LEXICAL_COMPARATOR в TableSorter.java из моего исходного поста следующим:

public static final Comparator LEXICAL_COMPARATOR = new Comparator() { public int compare(Object o1, Object o2) { if(o1 instanceof Integer) {<br> Integer firstNumeric, secondNumeric;</p> <pre><code> firstNumeric =(Integer)o1; secondNumeric= (Integer)o2; return firstNumeric.compareTo(secondNumeric); } else return o1.toString().compareTo(o2.toString()); } };

Теперь, в getValueAt, убедитесь, что ваши значения "int" преобразованы в Integer, просто выполнив: new Integer(intValue);

Надеюсь, это сэкономит людям время.

...