Метод сегментов () в типе BruteCollinearPoints не применим для аргументов (Point, Point)
Я пытаюсь изменить код, но получил ошибку, указанную в заголовке. Любой, пожалуйста, помогите.
Ошибка: метод сегментов () в типе BruteCollinearPoints не применим для аргументов (точка, точка)
import java.util.Collections;
import java.util.ArrayList;
import java.util.List;
import edu.princeton.cs.algs4.*;
public class BruteCollinearPoints
{
public BruteCollinearPoints(Point[] points) // finds all line segments containing 4 points
{
int N = points.length;
int i = 0;
for (int p = 0; p < N; p++) {
for (int q = p + 1; q < N; q++) {
double slopeToQ = points[p].slopeTo(points[q]);
for (int r = q + 1; r < N; r++) {
double slopeToR = points[p].slopeTo(points[r]);
if (slopeToQ == slopeToR) {
for (int s = r + 1; s < N; s++) {
double slopeToS = points[p].slopeTo(points[s]);
if (slopeToQ == slopeToS) {
// Create the list of collinear points and sort them.
List<Point> collinearPoints = new ArrayList<Point>(4);
collinearPoints.add(points[p]);
collinearPoints.add(points[q]);
collinearPoints.add(points[r]);
collinearPoints.add(points[s]);
Collections.sort(collinearPoints);
segments(Collections.min(collinearPoints), Collections.max(collinearPoints)); //this is where the error is
}
}
}
}
}
}
}
//public int numberOfSegments(); // the number of line segments
public LineSegment[] segments() // the line segments
{
return segments();
}
}
2 ответа
segments
Метод определяется так:
public LineSegment[] segments() // the line segments
{
return segments();
}
Это означает, что метод не принимает никаких аргументов, но вы вызываете его с двумя аргументами:
segments(Collections.min(collinearPoints), Collections.max(collinearPoints));
Чтобы это исправить нужно позвонить segments
метод без аргументов вроде этого:
segments();
или переопределите метод для работы с аргументами. Например:
public LineSegment[] segments(Point a, Point b)
{
// calculate line segments from a to b and return them
}
На заметку, segments
Метод, как он определен сейчас, наверняка не будет работать, потому что он вызывает себя рекурсивно без условия завершения.
Судя по вашим операторам импорта, вы работаете над заданием по программированию из курса " Алгоритмы, 4-е издание" под названием "Распознавание образов". В этом курсе метод segments()
возвращает массив типа LineSegment[]
из другого класса. Вы можете увидеть его в "образце клиентской программы", который предоставляется. Вот часть этого:
for (LineSegment segment : collinear.segments()) {
StdOut.println(segment);
segment.draw();
}
StdDraw.show();
Для того, чтобы реально создать новый LineSegment
, используйте что-то вроде этого:
LineSegment seg = new LineSegment(point1, point2)
Для справки, вот создатель, который называется в LineSegment.java
:
public class LineSegment {
private final Point p; // one endpoint of this line segment
private final Point q; // the other endpoint of this line segment
/**
* Initializes a new line segment.
*
* @param p one endpoint
* @param q the other endpoint
* @throws NullPointerException if either p or q is null
*/
public LineSegment(Point p, Point q) {
if (p == null || q == null) {
throw new NullPointerException("argument is null");
}
this.p = p;
this.q = q;
}
.
.
.
}