Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么此表将所有条目都按字符串排序?_Java_Swing_Sorting_Jtable - Fatal编程技术网

Java 为什么此表将所有条目都按字符串排序?

Java 为什么此表将所有条目都按字符串排序?,java,swing,sorting,jtable,Java,Swing,Sorting,Jtable,我有一个问题,我用数据填充JTable,并希望使用接口自动排序它。然而,它被排序为字符串,所以10在2之后。我怎样才能解决这个问题 public class GUI extends Frame implements ActionListener, WindowListener { private static final long serialVersionUID = -693036000167528691L; private Button run,findAll,sortByN

我有一个问题,我用数据填充JTable,并希望使用接口自动排序它。然而,它被排序为字符串,所以10在2之后。我怎样才能解决这个问题

public class GUI extends Frame implements ActionListener, WindowListener {
    private static final long serialVersionUID = -693036000167528691L;
    private Button run,findAll,sortByNumberOfStretchesFound, sortByLongestStretch;
    private TextField selectionSizeStart, numberOfThreads, selectionSizeEnd, minimumStretchSize, sequence;
    private JTable table;
    private String[] columnNames = new String[]{"#","Label","Label-Length","#Stretches Found","Unique","Longest Stretch"};
    private int sortBy = 3;
    private Object[][] data;

    public GUI(String defaultSequence, int defaultSelectionMinimumSize, int defaultNumberOfThreads) {
        table = new JTable(new DefaultTableModel(columnNames,0));

        table.setAutoCreateRowSorter(true);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        JScrollPane scrollbar = new JScrollPane(table);

        setLayout(new FlowLayout());


        setVisible(true);
        }
来自javadocs for;
setAutoCreateRowSorter
创建javadoc排序的实例,并根据其javadoc排序工作如下

  • 如果
    setComparator
    方法为列指定了
    比较器
    ,请使用它
  • 如果
    getColumnClass
    返回的列类是
    String
    ,请使用
    Collator.getInstance()返回的
    比较器
    
  • 如果column类实现了
    Comparable
    ,请使用调用
    compareTo
    方法的
    Comparator
  • 如果指定了
    表字符串转换程序
    ,请使用它将值转换为
    字符串
    s,然后使用
    Collator.getInstance()返回的
    比较器
  • 否则,对调用对象上的
    toString
    的结果使用
    Collator.getInstance()
    返回的
    Comparator
    因此,如果要更改默认值(本例中为5),则需要

  • 设置一个比较器
  • 数据对象中的ImplementSet
    Compariable
    ,或
  • 设置一个
    tableString转换器
    以实现自定义
    toString
    功能
  • 或者,您可以跳过所有这些,使用自己的自定义排序逻辑实现自定义

    编辑

    从OP的评论中可以看出,
    Integer
    String
    是一个混合数组

    没有明显的方法可以将
    整数
    字符串
    进行比较,因此您需要确定一条规则,我假设该规则是“字符串前的数字”

    现在,将所有数据封装在一个类中,该类在
    对象上实现
    Comparable
    ,并在该类中执行您的工作,或者实现一个
    比较器,将其设置在表上。在比较方法中,您需要使用
    instaceof
    计算出您要比较的内容并进行比较。该方法需要如下所示:

    class MyClass implements Comparator<Object> {
    
        public int compare(Object o1, Object o2) {
            if (o1 == null && o2 == null) {
                return 0;
            }
            if (o1 == null) {
                return 1;
            }
            if (o2 == null) {
                return -1;
            }
            if (o1 instanceof Integer && o2 instanceof String) {
                return 1;
            }
            if (o1 instanceof String && o2 instanceof Integer) {
                return -1;
            }
            if (o1 instanceof Integer && o2 instanceof Integer) {
                return ((Integer) o1).compareTo((Integer) o2);
            }
            return o1.toString().compareTo(o2.toString());
        }
    }
    
    类MyClass实现了Comparator{
    公共整数比较(对象o1、对象o2){
    如果(o1==null&&o2==null){
    返回0;
    }
    如果(o1==null){
    返回1;
    }
    如果(o2==null){
    返回-1;
    }
    if(整数的o1实例和字符串的o2实例){
    返回1;
    }
    if(字符串的o1实例和整数的o2实例){
    返回-1;
    }
    if(o1整数实例和o2整数实例){
    返回((整数)o1),比较((整数)o2);
    }
    返回o1.toString().compareTo(o2.toString());
    }
    }
    
    在字符串中,10在2之前。我不鼓励您混合使用AWT和Swing组件,否则它会对对象进行排序吗?您希望它如何将
    整数
    字符串
    MyRandomDto
    进行比较?设置自定义
    行排序器
    。另请参见:在数字列中放入整数。如何设置比较器?如果表中包含数字,那么按数字排序最简单的方法是什么?1)阅读我链接到的javadoc。2) 使用一个
    整数[]【】
    或任何东西,而不是您当前拥有的
    对象[]【】【】
    ,它将自动工作。如果我有一个混合数组怎么办?数组数据对象[]的一部分是字符串,一部分是整数。在我的回答中添加了一个示例。