从列表中的对象访问实例变量

时间:2009-12-31 02:57:41

标签: java

我正在研究一个自我分配的项目而不是休息,并且遇到了一个主要问题。这是Java中的基本行识别程序。

我有一个Points类,它从有序对中创建Point&将它发送到Line类的斜率&拦截计算。结果将发送回Points类,将结果存入ArrayList行列表。每个Line对象有三个部分:slope&截取整数和计算它们的点。

从循环中,我如何访问斜率&截取行列表中每个对象的变量进行比较?因为我不想比较这些点,只是斜率&拦截,equals()方法不是我需要的。

3 个答案:

答案 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中删除的对象进行比较,看看是否需要将其添加到现有的行列表中或开始新的行列表。