java 如何在外部泛型方法中寻址类的Comparator?

5us2dqdw  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(106)

我正在研究如何使用比较器来执行基于不同字段的比较。因此我创建了一个类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传递给另一个类的泛型方法时,问题就出现了。我为valuecurrent.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;
        }

但我找不到解决方案,因为比较器是特定的,应该绑定到一个类(它们使用它的字段)。
我需要对这个问题的任何见解。

nkhmeac6

nkhmeac61#

我觉得你的设计有点混乱和过于复杂。所以这里有一些建议。

  • 定义一个具有static quickSort方法的QuickSort类。
  • 定义一个Node类(或记录),它具有要排序的数据类型。这样做可以更容易地指定多个Comparator选项,并且还可以对具有不同值和类型的节点列表进行快速排序。
  • 首先,让quickSort在没有指定比较器的情况下工作。
  • 然后,使用Comparator interface的比较器使其工作。尝试不同的选项,如reverseOrder()thenComparing()etc

除非你必须实现自己的比较器,否则你可以在这里停止。否则,既然一切都正常,你可以专注于你的比较器,这极大地限制了任何开发错误的起源。
我会从以下内容开始:

record Node(int data1, int data2) {
}

class QuickSort {
    public static void quickSort(Node[] nodes, int low, int high, 
                Comparator<Node> comp) { //initially, comp can be ignored.
    ...
    }    
}

您的集成比较方法可能是这样的。最终被通过quickSort方法传递的方法所取代。请注意,这种方法的问题是它使用固定的类型和数量。因此它限制了您可以排序的内容。

public static int compare(Node n1, Node n2) {
   int a = n1.data1();
   int b = n2.data1();
            return a > b ? 1 : a < b ? -1 : 0;}
}

相关问题