我正在开发一个项目,我在内存中有一个表,例如:
field1 field2 field3 field4 field5
somevalue somevalue somevalue somevalue somevalue
somevalue somevalue somevalue somevalue somevalue
.
.
.
.
v
编写一个允许用户指定某些字段的非预定排列的函数的最佳方法是什么? (例如,按field2排序,然后按field1,然后按field5)。到目前为止,我想到的最好的方法是递归函数,但它很快就会变得很难看,尤其是在每列中创建和管理行的“子组”时。在我采取这种错综复杂的方法之前,有人能指出我更有效的方向吗?
顺便说一句,我的表存储为数组列表。
答案 0 :(得分:2)
这里要认识到的关键是你的搜索算法始终保持完全相同。唯一改变的是你的实际比较功能。
我建议您在Arrays
或Collections
课程中使用标准排序,但要编写自己的自定义Comparable
课程或Comparator
,其compare
方法将使用用户提供的数据。这实际上很有趣 - 我只编写了使用固定数据的Comparable
类,但这只是它们的用例。
您需要做的就是编写函数
public int compare(Row row1, Row row2) {
// iterate over the columns *in order of the user-supplied priority*
// return appropriately
}
Here's documentation on the Comparable class
您需要哪一个取决于您实施的内容,我忘记了细节,但应该是直截了当的。
这里的关键#2是你可以在设置优先级之前实例化你的ColumnPrioritiesComparable
类。 e.g。
class ColPriComp implements Comparable<ColPriComp> {
private volatile int[] priorities; // possibly static, or obtained some other way,
// so there's only one shared among all classes
@Override
public int compareTo(ColPriComp other) {
// use "priorities" to do the comparison
}
public void setPriorities(int[] newPriorities) {
this.priorities = newPriorities;
}
}