我有一个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更好的方法。
答案 0 :(得分: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) {
答案 1 :(得分:0)
重构代码以使用泛型没有任何问题。似乎此方法仅用于Point
,因此我选择Point[]
代替Comparable<Point>[]
。根据我的要求,您还必须重构其中的Point课程以及Comaprator compare
的{{1}}方法。
如果您被允许,只需下载所有代码并重构它。如果它编译一切都会好的,那么这就是java泛型的重点:它有助于在编译时没有做错。在运行时,由于type erasure而无论如何都是原始的。
答案 2 :(得分:0)
以下是一些你应该做的事情:
class Point implements Comparable
应该成为class Point implements Comparable<Point>
Comparator
应该成为Comparator<Point>
Comparable[]
替换为Point[]
- 如果您要将元素转换为Point
,您可以将它们声明为点替换
Collections.sort(line, new Comparator<Point>() {
public int compare(Point v, Point w) {
return v.compareTo(w);
}
});
冗余度较低
Collections.sort(line);