2

我有一个Point实现Comparable. 我想要做Point f = arr[first];

现在,我读到使用原始类型Comparable等是不好的。那么,如果我使用arr[]类型Comparable<Point>[]而不是Comparable[]我会做错什么?

这是被盗的代码,我喜欢它,我偷了它。

private static void sort(Comparable[] a, Point compPoint, int lo, int hi) {
    if (hi <= lo)
        return;
    int lt = lo;
    int gt = hi;
    int i = lo;
    int count = 0;
    Comparator comp = compPoint.SLOPE_ORDER;
    Comparable v = a[lo];
    ArrayList<Point> line = new ArrayList<Point>();
    line.add(compPoint);
    while (i <= gt) {
        int cmp = comp.compare(a[i], v);
        if (cmp < 0)
            exch(a, lt++, i++);
        else if (cmp > 0)
            exch(a, i, gt--);
        else {
            count++;
            line.add((Point) a[i]);
            i++;
        }
    }
    if (count >= 3) {
        Collections.sort(line, new Comparator<Point>() {
            public int compare(Point v, Point w) {
                return v.compareTo(w);
            }
        });
        for (int j = 0; j < line.size(); j++) {
            if (j == line.size() - 1)
                StdOut.println(line.get(j).toString());
            else
                StdOut.print(line.get(j).toString()
                    + " -> ");
        }

        line.get(0).drawTo(line.get(line.size() - 1));
    }

    sort(a, compPoint, lo, lt - 1);
    sort(a, compPoint, gt + 1, hi);
}



private static void exch(Comparable[] a, int v, int w) {
    Comparable tmp = a[v];
    a[v] = a[w];
    a[w] = tmp;
}

我想知道是否有比使用原始类型 Comparable 更好的方法。

4

3 回答 3

3

就像现在一样,您可以这样称呼它:

String[] array = {"a", "b"};
sort(array, point, 1, 2);

显然这是荒谬的。将字符串与点进行比较是毫无意义的。

该方法中的代码似乎适用于任何可比较的类型。考虑将签名更改为:

private static <T extends Comparable<T>> void sort(T[] a, T comp, int lo, int hi) {
于 2013-09-22T22:43:18.360 回答
0

这里有一堆你应该做的事情:

  • class Point implements Comparable应该成为class Point implements Comparable<Point>
  • Comparator应该成为Comparator<Point>
  • 替换Comparable[]Point[]- 如果要将元素转换为Points,不妨将它们声明为点
  • 代替

    Collections.sort(line, new Comparator<Point>() {
        public int compare(Point v, Point w) {
            return v.compareTo(w);
        }
    });
    

    冗余较少

    Collections.sort(line);
    
于 2013-09-22T22:43:24.513 回答
0

重构代码以使用泛型并没有错。似乎这种方法仅用于Points 所以我会用Point[]而不是Comparable<Point>[]. 从我所看到的情况来看,您还必须重构类Point和其中compare的 Comaprator 方法SLOPE_ORDER

如果您被允许,只需下载所有代码并重构它。如果它编译一切都会好的,那么这就是 java 泛型的重点:它有助于在编译时不做错任何事。在运行时,由于类型擦除,无论如何都是原始的。

于 2013-09-22T22:21:44.170 回答