説明前
のコンパレータにデリゲートするComparator
forオブジェクトを記述する必要があります。Table
tableName
new Comparator<Table>() {
@Override public int compare(Table one, Table two) {
return one.getTableName().compareTo(two.getTableName());
}
}
Table
これは、同じ名前を持つ s を等しいと見なすことに注意してください。これらのテーブルをHashMap
またはに配置すると、混乱する可能性があります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
さて、問題は、を名前でソートするのではなく、定義済みのソート順を課すことです。その場合、ファイルComparator
で定義された順序を意識した を作成する必要があり.properties
ます。
これを実現する 1 つの方法は、テーブル名からソート順インデックスへのマッピングを初期化し、比較中にそのマッピングを参照することです。与えられたプロパティ値:
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()
あなたが言及したように使用してコンマ区切りのリストを取得します
- その値をコンマで分割します(グアバの
Splitter
を使用することをお勧めしますがString.split
、他のものも機能します)
- 新規
HashMap<String, Integer>
およびint index = 0
- 分割されたトークンを反復処理し、現在のトークンをマップし
index
てインクリメントしますindex
どのテーブル名にもコンマが含まれていないという暗黙の前提に注意してください。