我正在研究一个自我分配的项目而不是休息,并且遇到了一个主要问题。这是Java中的基本行识别程序。
我有一个Points类,它从有序对中创建Point&将它发送到Line类的斜率&拦截计算。结果将发送回Points类,将结果存入ArrayList行列表。每个Line对象有三个部分:slope&截取整数和计算它们的点。
从循环中,我如何访问斜率&截取行列表中每个对象的变量进行比较?因为我不想比较这些点,只是斜率&拦截,equals()方法不是我需要的。
答案 0 :(得分:2)
听起来你想要这样的东西:
class Point {
final int x;
final int y;
Point(int x, int y) { this.x = x; this.y = y; }
}
class Line {
final int slope;
final int intercept;
Line(Point p1, Point p2) {
this.slope = ...;
this.intercept = ...;
}
}
class Points {
public void doIt(ArrayList<Point> points) {
ArrayList<Line> lines = new ArrayList<Line>();
for (int i = 0; i < points.size(); i++) {
for (int j = i + 1; j < points.size(); j++) {
lines.add(new Line(points.get(i), points.get(j));
}
}
for (int i = 0; i < lines.size(); i++) {
for (int j = i + 1; j < lines.size(); j++) {
Line line1 = lines.get(i);
Line line2 = lines.get(j);
if (line1.slope == line2.slope && line1.intercept == line2.intercept) {
// blah blah blah
}
}
}
}
}
(对于花生画廊,是的还有微观优化的空间。但不,除非你对程序进行了分析并发现存在真正的重大瓶颈,否则不值得努力。)
[对于更优雅和可扩展的解决方案,覆盖equals(Object)
类上的hashcode()
(和Line
)方法,并使用TreeSet替换lines
列表。这会减少O(N**2)
与O(NlogN)
比较的比较。但这对基本的编程练习来说太过分了。]
答案 1 :(得分:1)
从一个循环中,我如何访问斜率&amp;拦截行列表中每个对象的变量以进行比较?
只需在循环内的同一列表中添加另一个循环,然后在那里进行比较。
答案 2 :(得分:1)
您可以让Line
对象实现Comparable
接口。然后,您可以将比较逻辑放在Line
方法的compareTo
类中。那里的逻辑将测试斜率和截距是否匹配,如果是,则返回0
。如果您愿意,其他结果可能会返回1
或-1
来强制执行排序。
显然,您不需要实现此界面来实现所需的结果。但是,由于这是家庭作业,这样做将允许您使用JDK的某些功能,例如使用排序列表等。例如,使用排序列表,您可以避免使用嵌套循环,就像您一样只需将有问题的对象与刚刚从上一次迭代中的Iterator
中删除的对象进行比较,看看是否需要将其添加到现有的行列表中或开始新的行列表。