Java 为什么此表将所有条目都按字符串排序?
我有一个问题,我用数据填充JTable,并希望使用接口自动排序它。然而,它被排序为字符串,所以10在2之后。我怎样才能解决这个问题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
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),则需要
设置一个比较器
数据对象中的ImplementSetCompariable
,或
设置一个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) 使用一个整数[]【】
或任何东西,而不是您当前拥有的对象[]【】【】
,它将自动工作。如果我有一个混合数组怎么办?数组数据对象[]的一部分是字符串,一部分是整数。在我的回答中添加了一个示例。