我在Java library中使用了以下方法:
public void setColumnComparator(final int columnIndex, final Comparator<T> columnComparator)
Idea说它有以下原型:
setColumnComparator(columnIndex: Int, columnComparator: ((Any!, Any!) -> Int)!)
我该如何使用它?我知道它会是String
,所以我想要这样的东西,但它没有编译。
setColumnComparator(0, Comparator<String> { a, b -> a.compareTo(b) }
答案 0 :(得分:2)
如果仔细观察,则需要通过比较器来比较完整的值,而不是列中的值。因此,假设表中的数据类型为Car
(因此您有SortableTableView<Car>
),第一列包含模型名称。然后你就写了
setColumnComparator(0, { a, b -> a.modelName.compareTo(b.modelName) }
或更好:
setColumnComparator(0, compareBy({ it.modelName })
(见https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.comparisons/compare-by.html)
根据签名IDEA显示,您可能会改为SortableTableView<Any>
或SortableTableView<*>
。这确实应该更改为更具体的类型。但即使没有它,如果你可以有Car
或Book
:
compareBy({ (it as? Car)?.modelName }, { (it as? Book)?.title })
答案 1 :(得分:1)
如果您确定SortableTableView
的通用类型参数为String
,则可以将其转换为SortableTableView<String>
,然后拨打电话:
(tableView as SortableTableView<String>).setColumnComparator(1, { x, y ->
x.compareTo(y)
})
或者,您可以转换Comparator
单独执行的参数:
tableView.setColumnComparator(1, { x, y ->
(x as String).compareTo(y as String)
})