找到列表

时间:2015-10-21 12:48:32

标签: java performance foreach

所以我有三节课。一方面有 Point 类:

public class Point {
    public float x;
    public float y;

    // Every point has a list of connections to other points indicated
    // by their position in the list of points in the main class.
    public List<Integer> connections = new ArrayList<>();

    public Point(float x, float y) {
        this.x = x;
        this.y = y;
    }
}

另一方面, Line 类:

public class Line {
    public Point start;
    public Point end;

    public Line(Point start, Point end) {
        this.start = start;
        this.end = end;
    }
}

组合类:

public class Combination {
    public Line a;
    public Line b;

    public Combination(Line a, Line b) {
        this.a = a;
        this.b = b;
    }
}

我想要一种方法根据从给定点生成的行返回所有可能组合的列表。我目前的做法如下:

public static List<Combination> findCombinations(List<Point> points) {
    List<Combination> combinations = new ArrayList<>();
    List<Line> lines = new ArrayList<>();

    for (Point a : points) {
        for (int p : a.connections) {
            lines.add(new Line(a, points.get(p)));
        }
    }

    for (Line a : lines) {
        for (Line b : lines) {
            if (a == b) continue;
            combinations.add(new Combination(a, b));
        }
    }

    return combinations;
}

我有一个包含点列表的基类。对于该类的每个实例,我只调用上面的方法一次。但是,创建了很多实例,这种方法会减慢过程。

我需要找到这些组合,以便测试每个Combination实例中是否存在两条线(段)的交集。我基本上想找到相交的所有线条组合。为此,我需要获得组合,然后检查交叉点的位置。

交叉点的计算不是问题。

2 个答案:

答案 0 :(得分:2)

我通过点和线(通常称为节点和边)形成的这种图形通常在运行中迭代所需的组合。 所以通常不应该生成包含所有这些组合的明确列表。

如果你坚持创建所有组合,那么没有比迭代所有组合更快的方法了。 (更新:如果您的任务是查找所有线路交叉点,那么众所周知的算法会更快。此字段称为计算几何体)

如果图形是固定的,你可以加快一点,所以它在创建后不再改变 在这种情况下,您可以替换

 public List<Integer> connections = new ArrayList<>();

使用更快的int数组,它也使用了四分之一的内存:

public int[] connections.

此优化通常需要两个步骤。使用ArrayList构建图形,然后在准备就绪后,使用int[]

将所有图形转换为静态图形

此外,您提到&#34;效率&#34;。特别是在这里,人们必须决定内存效率(例如使用嵌入式导航系统)或计算速度(具有大量内存时使用)。

您的解决方案,我的答案与计算速度有关。

答案 1 :(得分:0)

如果目的是将新创建的线与所有其他线组合,则可以通过合并新Combination中的Line和之前的所有线来远离第二个结构。我不确定这会有多快(如果有的话),但我觉得它在代码组织方面要好一些。

public static List<Combination> findCombinations(final List<Line> lines, final List<Point> points) {
    final List<Combination> combinations = new ArrayList<>();

    for (Point a : points) {
        for (int p : a.connections) {
            Line l = new Line(a, points.get(p));
            for(int i=0; i<lines.size(); i++){
                combinations.add(new Combination(lines.get(i),l));
            }
            lines.add(l);
        }
    }

    return combinations;
}