簡體   English   中英

比較器基於可配置的順序

[英]Comparator based on a configurable order

有沒有辦法編寫自定義比較器,遵循此示例:

最多有10個項目以隨機順序進入,即

first item:  item_one
second:      second_one
third:       third_one

我希望將結果排序為: second_onethird_onefirst_one 我想從配置文件中提取此順序,有點像排序模板。

我使用錯誤的數據結構,有沒有人有這方面的經驗?

當然。 這是一個“ OrderedComparator ”,它根據預定義的順序比較元素:

class OrderedComparator implements Comparator<String> {

    List<String> predefinedOrder;

    public OrderedComparator(String[] predefinedOrder) {
        this.predefinedOrder = Arrays.asList(predefinedOrder);
    }

    @Override
    public int compare(String o1, String o2) {
        return predefinedOrder.indexOf(o1) - predefinedOrder.indexOf(o2);
    }

}

這是一些測試代碼。 (我使用List代替Set因為它1)在討論元素的順序時似乎更自然; 2)更好地說明在使用此比較器排序時重復元素會發生什么。)

class Test {

    public static void main(String[] args) {

        // Order (could be read from config file)
        String[] order = { "lorem", "ipsum", "dolor", "sit" };


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

        // Insert elements in random order.
        someList.add("sit");
        someList.add("ipsum");
        someList.add("sit");
        someList.add("lorem");
        someList.add("dolor");
        someList.add("lorem");
        someList.add("ipsum");
        someList.add("lorem");


        System.out.println(someList);

        Collections.sort(someList, new OrderedComparator(order));

        System.out.println(someList);
    }

}

輸出:

[sit, ipsum, sit, lorem, dolor, lorem, ipsum, lorem]
[lorem, lorem, lorem, ipsum, ipsum, dolor, sit, sit]

看一下TreeSet(http://download.oracle.com/javase/6/docs/api/java/util/TreeSet.html)。 您可以在構造函數中提供自定義Comparator。 此比較器將考慮您的配置。 檔案。 因為你想要任意順序,比較器的邏輯不會很漂亮。 您很可能最終會列舉所有可能的比較。

集合存儲無序元素。 如果你想進行比較和排序,你應該選擇一個列表。 這是給你的快速片段:

List<X> sorted = new ArrayList<X>(myset);
Collections.sort(sorted, new Comparator<X>() {
    public int compare(X o1, X o2) {
        if (/* o1 < o2 */) {
            return -1;
        } else if (/* o1 > o2 */) {
            return 1;
        } else {
            return 0;
        }
    }
});

現在你已經sorted ,它具有myset所有相同元素,由於是一個集合而無序。

您還可以查看對其元素進行排序的TreeSet ,但依賴於所訂購的集合通常不是一個好主意。

使用Guava的com.google.common.collect.Ordering:

Ordering.explicit(second_one, third_one, first_one);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM