基于另一个类中可用的参数对List进行排序

时间:2012-10-10 10:52:04

标签: java comparator

我遇到了Java Comparator接口的一些设计问题。

我有一个包含Set简单自定义数据结构的类:

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

ID是唯一的,因此可以使用ID‍‍‍‍‍获取整个数据。

和容器类:

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

出于某些不可避免的原因,我需要并行排序List dataList个ID。我需要PriorityComparator排序。

因为,Priority应该比较Comparator<int>,它应该实现List。但ID仅包含Priority个,且ID不能直接使用。

这就是问题所在。 List中只有Priority。因此,Comparator类无法访问{{1}}。

我如何设计这样的概念?

2 个答案:

答案 0 :(得分:1)

你可以使用闻起来更高阶函数的东西。也就是说,创建一个静态函数,它将从Long到int(这是优先级)或数据的排序映射,并返回一个新的Comparator。

Foo类有一个静态方法getComparator,它取橙色。 Orange是一个具有方法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));

我没有举例说明橘子的样子。

答案 1 :(得分:0)

我假设您在某处存储了List<Data> ..在Comparator中,您需要从数据类中调用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();
    }
}