我想比较正确的类,而不是字符串,对表进行正确排序。我正在使用TableRowSorter:
TableRowSorter sorter = new TableRowSorter<CustomModelTable>(modelData);
tablaEJ.setRowSorter(sorter);
我重写了CustomModelTable中的方法getColumnClass,因此根据列的名称获得了正确的类(这是因为类型是通过编程定义的):
@Override
public Class getColumnClass(int columnIndex)
{
try {
if (columnIndex < this.getColumnCount()) {
String name = getColumnName(columnIndex); //This just gets the header of the column
name = name.toLowerCase();
switch (name) {
case "int":
case "int[]":
case "núm.":
case "int[][]": return Integer.class; //Or Class.forName("java.lang.Integer");
case "byte":
case "byte[]":
case "byte[][]": return Class.forName("java.lang.Byte");
case "long":
case "long[]":
case "long[][]": return Class.forName("java.lang.Long");
case "float":
case "float[]":
case "float[][]": return Class.forName("java.lang.Float");
case "double":
case "double[]":
case "double[][]": return Class.forName("java.lang.Double");
case "boolean":
case "boolean[]":
case "boolean[][]": return Class.forName("java.lang.Boolean");
case "char":
case "char[]":
case "char[][]": return Class.forName("java.lang.Character");
case "string":
case "string[]":
case "string[][]": return Class.forName("java.lang.String");
default: return Class.forName("java.lang.String");
}
}
} catch (Exception e){
}
return null;
}
这是一个屏幕截图:表格排序错误
最奇怪的是我打印了这些类型:
for (int i = 0; i < tablaEJ.getModel().getColumnCount(); i++) {
System.out.println(tablaEJ.getModel().getColumnClass(i));
}
并返回预期输出(打印上表):
class java.lang.Integer
class java.lang.Integer
class java.lang.Integer
class java.lang.Integer
老实说,我不知道我做错了什么。
我认为您不应该强制转换这样做的类型。定义列时,您应该在设置任何内容之前实例化列的类型。
“安全”的方法是声明哪些列索引是数字:
public static class CustomTableModel extends DefaultTableModel {
private final List<Integer> columnIndicesWithNumbers = Arrays.asList(0);
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndicesWithNumbers.contains(columnIndex))
return Double.class;
return super.getColumnClass(columnIndex);
}
}
下面是一个完整的例子来测试自己:
public class SorterTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
DefaultTableModel dm = new CustomTableModel();
dm.addColumn("Integers");
dm.addColumn("Strings");
//@formatter:off
Object[][] data = {
{ 1, "Something" }, { 102, "Something Else" },
{ 55, "Something" }, { 66, "Something" },
{ 1000, "Something" }, { 1524, "Something" },
{ 5801, "Something" }, { -55, "Something" },};
//@formatter:on
for (Object[] row : data) {
dm.addRow(row);
}
JTable table = new JTable(dm);
table.setAutoCreateRowSorter(true);
JOptionPane.showMessageDialog(null, new JScrollPane(table));
});
}
public static class CustomTableModel extends DefaultTableModel {
private final List<Integer> columnIndicesWithNumbers = Arrays.asList(0);
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndicesWithNumbers.contains(columnIndex))
return Double.class;
return super.getColumnClass(columnIndex);
}
}
}
预览:
在您在评论部分作出澄清后:
为了返回整数而不是字符串,您可以使用@Overder
getValueAt
方法。
完整示例:
public class SorterTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
DefaultTableModel dm = new CustomTableModel();
dm.addColumn("Integers");
dm.addColumn("Strings");
//@formatter:off
Object[][] data = {
{ "1", "Something" }, { "102", "Something Else" },
{ "55", "Something" }, { "66", "Something" },
{ "1000", "Something" }, { "1524", "Something" },
{ "5801", "Something" }, { "-55", "Something" },};
//@formatter:on
for (Object[] row : data) {
dm.addRow(row);
}
JTable table = new JTable(dm);
table.setAutoCreateRowSorter(true);
JOptionPane.showMessageDialog(null, new JScrollPane(table));
});
}
public static class CustomTableModel extends DefaultTableModel {
private final List<Integer> columnIndicesWithNumbers = Arrays.asList(0);
@Override
public Object getValueAt(int row, int column) {
Object value = super.getValueAt(row, column);
if (columnIndicesWithNumbers.contains(column)) {
return Double.parseDouble(String.valueOf(value));
}
return value;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndicesWithNumbers.contains(columnIndex))
return Double.class;
return super.getColumnClass(columnIndex);
}
}
}
问题内容: 我在排序包含整数的字符串时遇到问题。如果使用下面的代码,我将进行排序:1some,2some,20some,21some,3some,一些 但是我希望将其排序为:1some,2some,3some,20some,21some,一些 我怎样才能做到这一点? 谢谢! 问题答案: 这是有关如何执行此操作的独立示例(未特别优化): 输出量 说明 该示例使用一个常数来推断数字是否位于的起始位置。
问题内容: 我有一个包含多个数组的数组,我想根据这些数组中的某个字符串对数组进行排序。 如何按名称排序,以便 阿尔伯特排 在首位, 齐默尔曼排 在最后? 我知道如果可以使用整数进行排序,但是字符串使我毫无头绪,该怎么办。 谢谢您帮忙!:) 问题答案: 这可以通过将支持函数作为参数传递给方法调用来实现。 像这样:
本文向大家介绍Swift对字符串数组进行排序,包括了Swift对字符串数组进行排序的使用技巧和注意事项,需要的朋友参考一下 例子 3.0 最简单的方法是使用sorted(): 或者 sort() 您可以将闭包作为排序参数: 尾随闭包的替代语法: 但是,如果数组中的元素不一致,则会出现意外结果: 要解决此问题,请对元素的小写版本进行排序: 或者import Foundation使用NSString的
问题内容: 我有一列包含这样的数据。破折号表示同一张发票的多份副本,这些副本必须按升序排序 我必须按此数字以升序对其进行排序,但是由于这是一个varchar字段,因此它按字母顺序进行排序,如下所示 为了解决这个问题,我尝试将-(破折号)替换为空,然后将其强制转换为数字,然后对该数字进行排序 虽然这更好,并像这样排序 有人建议我在-(破折号)上分割发票编号,并在2个分割部分上按顺序排列 喜欢====
问题内容: 我有这样的txt文件中的数据列表 我的任务是按照每个标准对这些数据进行排序,例如)按日期,纬度和经度排序 我尝试像这样的泡沫排序 这可行,但是需要太多时间 那里有在txt文件数据 有没有其他方法可以对这些数据进行排序? 问题答案: 我可能会破坏一些学生的家庭作业,但是这里… 正如课题所建议的那样,Java的自然方法是创建一个表示您的数据的类。然后实现一个将传递给实用方法的方法。 在运行
问题内容: 我知道这听起来微不足道,但是我没有意识到 的功能很奇怪。我有一个实际上是字符串形式的“数字”列表,因此我先将它们转换为整数,然后尝试进行排序。 给我: 我想要的是 我四处寻找与排序数字集相关的算法,但是我发现所有算法都涉及对字母数字集进行排序。 我知道这可能是个没有脑子的问题,但是google和我的教科书没有提供比该.sort()功能有用的功能。 问题答案: 您实际上尚未将字符串转换为