我遇到了Java Comparator
接口的一些设计问题。
我有一个包含Set
简单自定义数据结构的类:
class data {
Long ID;
int Priority;
...
}
ID
是唯一的,因此可以使用ID
获取整个数据。
和容器类:
class Container {
Set<data> mySet = ...;
List<Long> myList = ...;
...
}
出于某些不可避免的原因,我需要并行排序List
data
个List
个ID。我需要Priority
按Comparator
排序。
因为,Priority
应该比较Comparator<int>
,它应该实现List
。但ID
仅包含Priority
个,且ID
不能直接使用。
这就是问题所在。 List
中只有Priority
。因此,Comparator类无法访问{{1}}。
我如何设计这样的概念?
答案 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();
}
}