【问题标题】:Comparing by value in multiple lists with lambda functions使用 lambda 函数在多个列表中按值进行比较
【发布时间】:2021-07-05 17:04:36
【问题描述】:

我坚持根据值比较 2 个或更多相同尺寸的列表。一些背景:我正在尝试制作一个赛车应用程序,通过扇区跟踪您的圈数,然后提供理想的线路,这是在扇区记录的最低时间。数据放在哈希图中,键是圈数,值是浮点数数组。到目前为止,我已经尝试过这样做(在代码下它是提供格式的数据)。我想知道是否可以按位置比较数组中的值(例如,第一个位置与其他数组中的第一个位置,第二个位置与其他数组中的第二个位置等),因为我的有缺陷 - 通过番石榴功能,或任何其他更好的比较方式。感谢您的帮助。

public ArrayList<Float> idealLine(Map<Integer, List<Float>> durations) {
    
   ArrayList<Float> idealLap = new ArrayList<Float>();
   
    for(int i = 0; i < durations.size(); i++) {
        if(durations.size() < (i + 1)) {
            break;
        }
        else {

            ArrayList<Float> values = new ArrayList<Float>();
            for(int key : durations.keySet()) {
                values.add(durations.get(key).get(i));
            }

            int index = values.indexOf(Collections.min(values));

            idealLap.add(values.get(index));
        }
    }
    return idealLap;
}

//        1/[18.0, 18.0, 13.0, 5.0, 18.0]
//        2/[18.0, 18.0, 13.0, 5.0, 18.0]
//        3/[19.0, 27.0, 22.0, 8.0, 31.0]
//        4/[21.0, 22.0, 15.0, 6.0, 21.0]

我想要的首选输出是每列中的最小值,即 18.0、18.0、13.0、5.0、18.0。

【问题讨论】:

  • 欢迎来到 SO。请说明您期望的比较结果(可能提供失败的测试用例)。
  • 您好,谢谢。我的预期结果是从每一列中获取最低值,因此它应该是这样的:18.0、18.0、13.0、5.0、18.0。目前,我已经做到了如上所示,它只提供与圈数一样多的值,这是不正确的。

标签: java android guava


【解决方案1】:

作为tweeted by StackOverflow's creator, Jeff Atwood,您在编程中犯了最常见的错误之一:迭代时出错。一旦您将循环更改为非严格不等式for(int i = 0; i &lt;= durations.size(); i++) 并删除多余的 if 条件,您就会很好。

@Test
public void shouldPrintIdealLineMap() {
    final ArrayList<Float> idealLine = idealLine(Map.of(
            1, List.of(18.0f, 18.0f, 13.0f, 5.0f, 18.0f),
            2, List.of(18.0f, 18.0f, 13.0f, 5.0f, 18.0f),
            3, List.of(19.0f, 27.0f, 22.0f, 8.0f, 31.0f),
            4, List.of(21.0f, 22.0f, 15.0f, 6.0f, 21.0f)
    ));
    assertThat(idealLine)
            .containsExactly(18.0f, 18.0f, 13.0f, 5.0f, 18.0f);
}

public static ArrayList<Float> idealLine(Map<Integer, List<Float>> durations) {

    ArrayList<Float> idealLap = new ArrayList<Float>();

    for (int i = 0; i <= durations.size(); i++) {

        ArrayList<Float> values = new ArrayList<Float>();
        for (int key : durations.keySet()) {
            values.add(durations.get(key).get(i));
        }

        int index = values.indexOf(Collections.min(values));

        idealLap.add(values.get(index));
    }
    return idealLap;
}

【讨论】:

    猜你喜欢
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2010-11-28
    • 2018-05-16
    相关资源
    最近更新 更多