【问题标题】:Comparing one element in a list of lists比较列表列表中的一个元素
【发布时间】:2016-11-17 15:03:07
【问题描述】:

感谢您抽出宝贵时间阅读。

所以基本上我有两个“列表列表”,一个用于垂直线,一个用于水平线。这些“列表列表”中的每一个都包含 Line2D 元素的列表(我正在处理的每个形状都有一个列表)。我想将每个列表的每个 Line2D 与其他列表中的每个其他元素进行比较(例如:水平行中第一个列表的第一个元素与水平行的 OTHER 列表中的每个元素)。如果两条线比某个值更接近,就会发生一些事情。

我在这里找到了一些有用的技巧,关于如何将列表中的一个项目与所有其他项目进行比较,但如何为列表列表执行此操作却让我无法理解。我已经尝试了下面的代码并收到一个 Index Out of Bounds Exception Index: 3 Size: 3 Exception。我是一名初学者,因此非常感谢任何和所有建议。如果我需要提供更多代码或任何其他信息,请告诉我。谢谢!

for(List<Line2D> list : horizontal) {
    for(int i = 0; i < list.size(); i++) {
        for(int j =i+1; j < horizontal.get(j).size(); j++) {
            if((Math.abs(list.get(i).getY1()) - Math.abs(horizontal.get(j).get(i).getY1())) < 0.4) {
                //do something
            }
        }
    }
}

【问题讨论】:

  • 另外,这是最好的方法吗?我确定有一种更“优雅”的方式来比较这些元素?
  • List&lt;Line2D&gt; 的元素不是列表,它们是Line2D 元素。你有显示列表列表的代码 sn-p 吗?
  • @TimBiegeleisen horizontal 是二维列表
  • @4castle 我看到了,问这个问题让我感到羞耻。
  • 如果您碰巧使用的是 Java 8,那么使用Stream 会有一些真的 优雅的方法来做到这一点,但这完全取决于do something 是什么

标签: java list for-loop foreach


【解决方案1】:

两个外部for 循环将触及List&lt;Line2D&gt; 的所有唯一对,可以从horizontal 获取。对于这两个列表中的每一个,内部的两个 for 循环遍历所有可能的条目组合,计算 Y1 值中差异的绝对值,并在该差异应小于某个阈值时采取行动。

for (int i=0; i < horizontal.size(); ++i) {
    for (int j=i+1; j < horizontal.size(); ++j) {
        List<Line2D> line1 = horizontal.get(i);
        List<Line2D> line2 = horizontal.get(j);

        for (int k=0; k < line1.size(); ++k) {
            for (int l=0; l < line2.size(); ++l) {
                if (Math.abs(line1.get(k).getY1() - line2.get(l).getY1()) < 0.4) {
                    // do something
                }
            }
        }
    }
}

如果有人可以发布一个更优雅的解决方案,可能会使用 Java 8 流,那将会很有趣。

【讨论】:

  • 我相信(Math.abs(line1.get(k).getY1() 必须是(Math.abs(line1.get(k).getY1()) 才能正确封装Math.abs 函数?现在对此进行测试,并将报告!
  • @ThorCodinson 你是对的,我在那里遇到了问题。实际上,Math.abs() 应该包含整个差异。我从错误使用它的 OP 中复制。
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2012-02-19
  • 2022-11-22
  • 1970-01-01
  • 2020-11-14
  • 2019-12-07
相关资源
最近更新 更多