澄清前
您需要为委托给比较器Comparator
的Table
对象编写一个tableName
:
new Comparator<Table>() {
@Override public int compare(Table one, Table two) {
return one.getTableName().compareTo(two.getTableName());
}
}
请注意,这将认为Table
具有相同名称的 s 是相等的。HashMap
如果您将这些表放在 a或中,这可能会搞砸HashSet
。为避免这种情况,您可以检测这种情况并one.hashCode() - two.hashCode()
在表名相同时返回。
GuavaComparisonChain
是编写此类多阶段比较的便捷方式:
new Comparator<Table>() {
@Override public int compare(Table one, Table two) {
return ComparisonChain.start()
.compare(one.getTableName(), two.getTableName())
.compare(one.hashCode(), two.hashCode())
.result();
}
}
澄清后
好的,问题是强加一个预定义的排序顺序,而不是Table
按名称对 s 进行排序。在这种情况下,您需要Comparator
知道.properties
文件中定义的顺序。
实现此目的的一种方法是初始化表名到排序顺序索引的映射,并在比较期间引用该映射。给定属性值:
SORT_ORDER = SALES,SALE_PRODUCTS,EXPENSES,EXPENSES_ITEMS
映射应如下所示:
{
SALES: 0,
SALE_PRODUCTS: 1,
EXPENSES: 2,
EXPENSES_ITEMS: 3
}
这是比较器的样子:
private static class PredefinedOrderComparator implements Comparator<Table> {
public PredefinedOrderComparator() {
// Initialize orderIndex here
}
private final Map<String, Integer> orderIndex;
@Override public int compare(Table one, Table two) {
return orderIndex.get(one.getTableName()) - orderIndex.get(two.getTableName());
}
}
要从属性值填充orderIndex
,您需要:
getProperty()
使用您提到的获取逗号分隔的列表
- 用逗号分割该值(我建议使用Guava's
Splitter
,但String.split
或者其他人也可以)
- 初始化一个新
HashMap<String, Integer>
的和一个int index = 0
- 遍历拆分标记,将当前标记映射到
index
并递增index
请注意隐含的假设,即所有表名中都没有逗号。