我正在研究如何使用比较器来执行基于不同字段的比较。因此我创建了一个类Event
,其中包含两个Comparator。
class Event {
int x, y;
boolean isLeft;
int index;
Event(int x, int y, boolean isLeft, int index) {
this.x = x;
this.y = y;
this.isLeft = isLeft;
this.index = index;
}
public static <T extends Comparable> T[] quickSort(T[] a, int fst, int last, Comparator<T> comp) {
int left = fst;
int right = last;
int middle = (last + fst) / 2;
T x = a[middle];
do {
while (comp.compare(a[left], x) < 0) left++;
while (comp.compare(a[right], x) > 0) right--;
if (left <= right) {
T temp = a[right];
a[right] = a[left];
a[left] = temp;
left++;
right--;
}
} while (left <= right);
if (left < last) {
quickSort(a, left, last, comp);
}
if (fst < right) {
quickSort(a, fst, right, comp);
}
return a;
}
static class XComparator implements Comparator<Event> {
@Override
public int compare(Event e1, Event e2) {
return (e1.x < e2.x) ? -1 : (e1.x > e2.x) ? 1 : (e1.y < e2.y) ? -1 : 1;
}
}
static class YComparator implements Comparator<Event> {
@Override
public int compare(Event e1, Event e2) {
return (e1.y < e2.y) ? -1 : (e1.y > e2.y) ? 1 : (e1.x < e2.x) ? -1 : 1;
}
}
}
当我将Comparator传递给另一个类的泛型方法时,问题就出现了。我为value
和current.value
以及Comparator提供的泛型类型的冲突如下:
“Event.YComparator”中的“compare(Event,Event)”不能应用于“(T,T)”
Node Rec(Node current, T value, Event.YComparator comp) {
if (current == null) {
size++;
current = new Node(value);
return current;
}
else if (comp.compare(value, current.value) < 0) {
current.leftChild = Rec(current.leftChild, value, comp);
} else if(comp.compare(value, current.value) > 0) {
current.rightChild = Rec(current.rightChild, value, comp);
} else {
return current;
}
但我找不到解决方案,因为比较器是特定的,应该绑定到一个类(它们使用它的字段)。
我需要对这个问题的任何见解。
1条答案
按热度按时间nkhmeac61#
我觉得你的设计有点混乱和过于复杂。所以这里有一些建议。
static quickSort
方法的QuickSort
类。Node
类(或记录),它具有要排序的数据类型。这样做可以更容易地指定多个Comparator选项,并且还可以对具有不同值和类型的节点列表进行快速排序。quickSort
在没有指定比较器的情况下工作。Comparator interface
的比较器使其工作。尝试不同的选项,如reverseOrder()
,thenComparing()
,etc
。除非你必须实现自己的比较器,否则你可以在这里停止。否则,既然一切都正常,你可以专注于你的比较器,这极大地限制了任何开发错误的起源。
我会从以下内容开始:
您的集成比较方法可能是这样的。最终被通过
quickSort
方法传递的方法所取代。请注意,这种方法的问题是它使用固定的类型和数量。因此它限制了您可以排序的内容。