首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TableSorter数值排序

TableSorter数值排序
EN

Stack Overflow用户
提问于 2011-05-19 06:39:20
回答 3查看 3K关注 0票数 0

由于我使用的是Java 1.4.2,这意味着我不能使用Java的表排序器实现。取而代之的是,我一直在使用上一篇文章的早期回复中的TableSorter.java类:Heads up on implementing rowsorter and rowfilter java 1.4

然而,它完美地解决了一个问题,那就是它不能正确地对数值进行排序。例如,我的表中有以下数字序列: 5,18,9,7,2,33

递增排序将在我的JTable中像这样显示它们:

18,2,33,5,7,9

降序排序将在我的JTable中像这样显示它们: 9,7,5,33,2,18

我不知道你是否意识到了,但是很明显,数值的排序只基于第一个数字。

你有什么快速解决这个问题的办法吗?请记住,按照getValue()方法的建议,这些数值在我的JTable中用作字符串。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-19 16:47:07

为了向你们更新这一点,我所做的是用以下内容替换了我最初帖子中的TableSorter.java中的LEXICAL_COMPARATOR:

代码语言:javascript
复制
 `public static final Comparator LEXICAL_COMPARATOR = new Comparator() {         public int compare(Object o1, Object o2) {             if(o1 instanceof Integer)             {`
代码语言:javascript
复制
             `Integer firstNumeric, secondNumeric;`
代码语言:javascript
复制
            firstNumeric =(Integer)o1;
            secondNumeric= (Integer)o2;

                    return firstNumeric.compareTo(secondNumeric);


        }
        else
        return o1.toString().compareTo(o2.toString());
    }
};

现在,在Integer中,确保通过执行以下操作将"int“值转换为getValueAt:new Integer(intValue);

我希望这将为人们节省一些时间。

票数 0
EN

Stack Overflow用户

发布于 2011-05-19 06:58:43

验证getColumnClass()是否返回数值类型,如Number

附录:TableSorterDemo中的MyTableModel就是一个例子。第三列的数据属于Integer类型,这是Number的子类;因此,getColumnClass()返回Integer.class。因为Integer实现了Comparable,所以列是按数字排序的。

票数 2
EN

Stack Overflow用户

发布于 2011-05-19 06:50:14

您需要实现一个执行数字比较的Comparator,而不是默认的字典序比较。所以类似于(取自http://crossedlogic.blogspot.com/2008/11/java-custom-comparators-sorting-text.html):

代码语言:javascript
复制
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);
                        }
                    }
                }
            }
        }
    };

然后将其作为列的比较器传入:

代码语言:javascript
复制
tblSorter.setColumnComparator(String.class, c1);

让我知道它是如何工作的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6051838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档