Algorithm-Assignment3-CollinearPoints

原本以为 github 上 pull 下来的代码是 ok 的

结果一提交发现自己收到了来自两年前自己的背刺

当时混到了 40 分,那个版本没有 push……

在 26 分卡了一个小时,而且全是语言特性的坑

根本还没涉及到 merge sort 的算法

BruteCollinearPoints

1. IllegalArgumentException

1
2
3
4
5
6
7
Test 1: points from a file
* filename = input8.txt

java.lang.IllegalArgumentException: both arguments to LineSegment constructor are the same point: (10000, 0)

LineSegment.<init>(LineSegment.java:20)
BruteCollinearPoints.<init>(BruteCollinearPoints.java:44)

给的 point 参数里面有重复的点,需要去判断这个情况抛异常

1
2
3
4
5
6
Arrays.sort(points1);
for (int i = 0; i < points1.length; i++) {
if (i > 0 && points[i].compareTo(points[i - 1]) == 0) {
throw new IllegalArgumentException();
}
}

2. NullPointerException

1
2
3
4
5
6
Test 1: points from a file
* filename = input8.txt

java.lang.NullPointerException

BruteCollinearPoints.<init>(BruteCollinearPoints.java:47)

这里卡了一个小时

后来发现是在调用 this.segments.add(segment) 的时候忘了初始化 this.segments

这时候还是用 private List<LineSegment> segments 偷懒的

3. ClassCastException

1
2
3
4
5
6
Test 1: points from a file
* filename = input8.txt

java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [LLineSegment; ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; [LLineSegment; is in unnamed module of loader 'app')

BruteCollinearPoints.segments(BruteCollinearPoints.java:63)

终究还是把 segments 声明成了 LineSegment[]

然后用一个 ArrayList 去存答案,最后转换过来

1
2
3
4
5
6
List<LineSegment> ans = new ArrayList<>();

//...

LineSegment[] ls = new LineSegment[ans.size()];
this.segments = ans.toArray(ls);