有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么这个表将所有条目都按字符串排序?

我的问题是,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);
        }

共 (1) 个答案

  1. # 1 楼答案

    来自javadocs的^{}setAutoCreateRowSorter创建^{}的实例,并从它的javadoc排序工作如下

    1. 如果setComparator方法为列指定了Comparator,请使用它
    2. 如果getColumnClass返回的列类是String,则使用Collator.getInstance()返回的Comparator
    3. 如果column类实现了Comparable,请使用调用compareTo方法的Comparator
    4. 如果指定了TableStringConverter,则使用它将值转换为String,然后使用Collator.getInstance()返回的Comparator
    5. 否则,在对象上调用toString的结果上使用Comparator返回的Collator.getInstance()

    因此,如果你想更改默认值(本例中为5),你需要

    1. 设置一个Comparator
    2. 在数据对象或
    3. 设置TableStringConverter以实现自定义toString功能

    {或者^你可以用自定义的^来实现你自己的逻辑

    编辑

    从OP的评论来看,有一个混合数组IntegerString

    没有明显的方法来比较IntegerString,所以你需要决定一个规则,我假设规则是“字符串之前的数字”

    现在,将所有数据包装在一个类中,该类在Object上实现Comparable,并在那里完成工作,或者实现一个Comparator<Object>,将其设置在表上。在compare方法中,您需要使用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());
        }
    }