2012-10-10 83 views
1

我對Java Comparator接口有一些設計問題。根據另一個類中可用的參數對列表進行排序

我有一個包含一個簡單的自定義數據結構的Set類:

class data { 
    Long ID; 
    int Priority; 
    ... 
} 

ID s爲唯一的,所以可以使用ID‍‍‍‍‍對整個事件的數據。

和容器類:

class Container { 
    Set<data> mySet = ...; 
    List<Long> myList = ...; 
    ... 
} 

一些必然的原因,我需要保持一個排序dataList標識並行。我需要ListPriority排序。

因爲Comparator應該比較Priority它應該實現Comparator<int>。但List僅包含ID s和Priority不可直接使用。

這是問題所在。 List中只有ID。因此,比較器類無權訪問Priority

我該如何設計這樣的概念?

+1

你想要橙汁,但你不提供橙子,是吧? – Juvanis

+0

哈哈,是的。但橙色在其他地方可用! :D 我只是不知道如何訪問它! – MBZ

+0

你有你創建的實例列表嗎? –

回答

1

你可以使用那些聞起來像高階函數的東西。也就是說,建立一個靜態函數,它將從Long到int(這是優先級)或數據的排序映射返回一個新的比較器。

Foo類有一個靜態方法getComparator需要一個橙色。橙色是一個類,它有一個方法getPriority它採用ID返回相應的優先級。 getComparator方法構造新的Comparator對象。新的Comparator對象的compare方法需要兩個ID。它查找兩個ID的相應優先級並進行比較。

public interface Orange { 
    // Looks up id and returns the corresponding Priority. 
    public int getPriority(Long id); 
} 

public class Foo { 
    public static Comparator<Long> getComparator(final Orange orange) { 
     return new Comparator<Long>() { 
      public int compare(Long id1, Long id2) { 
       // Get priority through orange, or 
       // Make orange juice from our orange. 
       // You may want to compare them in a different way. 
       return orange.getPriority(id1) - orange.getPriority(id2); 
     }; 
    } 
} 

我的java有點生疏,所以代碼可能有缺陷。不過,總體思路應該起作用。

用法:

// This is defined somewhere. It could be a local variable or an instance 
// field or whatever. There's no exception (except is has to be in scope). 
Collection c = ...; 
... 
Orange orange = new Orange() { 
    public int getPriority(Long id) { 
     // Insert code that searches c.mySet for an instance of data 
     // with the desired ID and return its Priority 
    } 
}; 
Collections.sort(c.myList, Foo.getComparator(orange)); 

我還沒有得出了一個橙色如何看一個例子。

+0

我真的沒有得到你的答案:(能否請你添加更多的細節? – MBZ

+0

是的,你能給什麼缺少一些提示嗎? – ReyCharles

+0

我加了一些命名我的問題,這將是非常好的如果你在我的命名中重寫你的代碼:) – MBZ

0

我假設你有一個List<Data>存儲的地方。在比較,你需要從你的數據類中調用一個方法getDataById,並通過排序優先級..

檢查下面的代碼。我已經使用了許多通用型單級..

理想情況下,你會想分解成多個類別 ..但是,這僅僅是一個演示,如何實現你想要的..

class Container { 
    // List of Data instances created.. 
    // This list has to be static, as it is for a class, 
    // and not `instance specific` 
    public static List<Data> dataList = new ArrayList<Data>(); 

    // List of Ids, that you want to sort. 
    private List<Long> idList = new ArrayList<Long>(); 

    // Populate both the list.. 

    // Have a method that will iterate through static list to 
    // find Data instance for a particular id 

    public static Data getDataById(long id) { 
     // Find Data with id from the list 

     // Return Data 
    } 

    public void sortList() { 
     Collections.sort(idList, new MyComparator()); 
    } 
} 

public MyComparator implements Comparator<Long> { 

    public int compare(Long int1, Long int2) { 
     Data data1 = Container.getDataById(int1); 
     Data data2 = Container.getDataById(int2); 

     return data1.getPriority() - data2.getPriority(); 
    } 
} 
+0

感謝您的解決方案。但我無法將Container類重新定義爲「Static」。 'List'在不同的實例中必須有所不同。 – MBZ

+0

@MBZ ..這是沒有意義的..你怎麼能有實例爲每個實例創建一個不同的列表。沒有創建的實例必須是相同的所有實例..其實這是特定類的.. –

+0

@MBZ ..而且你是不是讓你的'Container'類的靜態..但是,除非你使用一個數據庫列表保存你的情況下'Static' ..不這樣做,你不能達到你想要的.. –

相關問題