3

Tableオブジェクトにデータをとして格納する Vector オブジェクトを作成しましたVector<Table>Vector<Table>以下のような成分が含まれています。

[Vector<Record> records, String tableName, String keyColumnName, int recordCount, int columnCount]

tableName上記のベクターを自分の順序でソートし、他のプロセスのために戻る必要がありVector<Table>ますsorted tableNames

私は以下のように方法を書きました。

private Vector<Table> orderTables(Vector<Table> loadTables) {

    List<String> tableNames = new ArrayList<String>();

    for (Table table : loadTables) {

        String tblName = table.getTableName();
        tableNames.add(tblName);

    }
    Collections.sort(tableNames, new MyComparable());

    return null;
}

しかし、私はこれに書き込む方法がわかりませんComparator。私自身のソート順は.propertiesファイルに保存されています。私はそれを読んで価値を得ることができます。しかし、それを比較する方法がわかりません。

どうすればできますか?

4

3 に答える 3

5

説明前

のコンパレータにデリゲートするComparatorforオブジェクトを記述する必要があります。TabletableName

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値から設定するには、次のことを行う必要があります。

  1. getProperty()あなたが言及したように使用してコンマ区切りのリストを取得します
  2. その値をコンマで分割します(グアバのSplitterを使用することをお勧めしますがString.split、他のものも機能します)
  3. 新規HashMap<String, Integer>およびint index = 0
  4. 分割されたトークンを反復処理し、現在のトークンをマップしindexてインクリメントしますindex

どのテーブル名にもコンマが含まれていないという暗黙の前提に注意してください。

于 2012-05-09T09:29:35.310 に答える
1
 public class MyComparable implements Comparator<Table>{
   @Override
   public int compare(Table table1, Table table2) {
    return (table1.getTableName().compareTo(table2.getTableName());
   }
 }

これを実現するには、Table クラスで hashcode と equals をオーバーライドしたことを確認してください。

于 2012-05-09T09:29:05.663 に答える
1

Comparator を使用する方法について、非常に簡単な例を書きました。Main というクラスを作成し、その下の内容をコピペしてコンパイルして実行するとどうなるかがわかります。

コンパレータは、インターフェイスを実装するだけで済みます。このためには、1 つのメソッド (public int compare(T arg0, T arg1) を実装する必要があります。ここで、コレクションの並べ替え方法を指定します。この場合は、アルファベットに従っています。

これがお役に立てば幸いです。

import java.util.*;

public class Main {

    public static void main(String[] args) {
        System.out.println("Start\n");
        List<Item> items = new ArrayList<Item>();
        for(String s : new String[]{"mzeaez", "xcxv", "hjkhk", "azasq", "iopiop"}) {
            items.add(createItem(s));
        }
        System.out.println("Items before sort:");
        System.out.println(Item.toString(items));
        Collections.sort(items, new ItemComparator());
        System.out.println("Items after sort:");
        System.out.println(Item.toString(items));
        System.out.println("End");
    }

    private static Item createItem(String s) {
        Item item = new Item();
        item.setS(s);
        return item;
    }

}

class Item {

    private String s;

    public String getS() {
        return s;
    }

    public void setS(String s) {
        this.s = s;
    }

    @Override
    public String toString() {
        return "Item: " + s;
    }

    public static String toString(Collection<Item> items) {
        String s = "";
        for(Item item : items) {
            s += item + "\n";
        }
        return s;
    }    

}

class ItemComparator implements Comparator<Item> {

    @Override
    public int compare(Item item1, Item item2) {
        return item1.getS().compareTo(item2.getS());
    }

}
于 2012-05-09T09:47:10.813 に答える