【问题标题】:Get the median of arraylist of arraylist获取arraylist的arraylist的中位数
【发布时间】:2021-08-05 05:12:28
【问题描述】:

我正在寻找一个中位数的 arraylist of doubles 并且我需要帮助?

ArrayList<ArrayList<Double> > List = new ArrayList<ArrayList<Double> >();

如果您查看列表列表,如下例所示:

c1-5.0,4.5,10.3,3.5

c2-2.5,1.0,7.8,8.6

c3-6.0,5.6,9.6,9.5

应该到这里

c1-5.0,4.5,9.6,8.6

我尝试过但显示错误的行

middle =Double.sum(List.get((List.size()/2)), List.get(List.size()/2 - 1));

【问题讨论】:

  • 您好。你必须更好地阐述你的问题。 media 是什么,我假设 median 但您实际上并没有根据您的预期输出计算中位数。还发布您迄今为止尝试过的内容。
  • 我看不出那行代码与手头的任务有什么关系。您的嵌套列表都是 4 长,因此您需要计算 4 个不同的中位数。为此,您需要一个循环,但我看不到循环。对于索引i 处的中位数,您需要获取每个嵌套列表的索引i 处的值并对其进行排序。我看不到排序逻辑。如果嵌套列表的数量是奇数,则取排序值的中间值,但我没有看到任何代码执行任何此类逻辑。我要继续吗?请做出更好的尝试。
  • 也许这可以帮助你stackoverflow.com/a/41117975/1425697

标签: java arraylist


【解决方案1】:

要计算每列的中位数列表,应将输入列表转置(将列转换为行),然后排序,然后才应在检查being odd or even 的列长度后计算中值。

此外,可能需要额外检查以丢弃输入数据中的空/空子列表。

使用 Stream API 来实现这个任务可能会很方便:

static List<Double> medians(List<List<Double>> data) {
    int maxCols = data.stream().filter(Objects::nonNull).mapToInt(List::size).max().orElse(0);
    return IntStream.range(0, maxCols)
        .mapToObj(j -> IntStream
            .range(0, data.size())
            .filter(i -> data.get(i) != null && j < data.get(i).size())
            .mapToObj(i -> data.get(i).get(j))
            .sorted()
            .collect(Collectors.collectingAndThen(
                Collectors.toList(),
                list -> list.size() % 2 == 1 
                    ? list.get(list.size() / 2) 
                    : (list.get(list.size() / 2) + list.get(list.size() / 2 - 1)) /2
                ))
        )
        .collect(Collectors.toList());
}

测试:

System.out.println(medians(
    Arrays.asList(
        List.of(5.0, 4.5, 10.3, 3.5),
        List.of(2.5, 1.0,  7.8),
        List.of(6.0, 5.6,  9.6, 9.5, 12.0),
        null,
        Collections.emptyList()
    )
));

输出

[5.0, 4.5, 9.6, 6.5, 12.0]

【讨论】:

    【解决方案2】:

    给定:

    List<List<Double> > doublesLists = Arrays.asList(
            Arrays.asList(5.0,4.5,10.3,3.5),
            Arrays.asList(2.5,1.0,7.8,8.6),
            Arrays.asList(6.0,5.6,9.6,9.5)
    );
    

    你可以这样做:

    List<Double> medians = IntStream.range(0, doublesLists.get(0).size())
            .mapToDouble(i -> {
                List<Double> doubles = doublesLists.stream()
                        .mapToDouble(doublesList -> doublesList.get(i))
                        .sorted()
                        .boxed()
                        .collect(Collectors.toList());
    
                return doubles.size()%2 == 1 ? doubles.get(doubles.size()/2) : (doubles.get(doubles.size()/2) + doubles.get(doubles.size()/2-1))/2;
            })
            .boxed()
            .collect(Collectors.toList());
    
    System.out.println(medians);
    

    输出:

    [5.0, 4.5, 9.6, 8.6]
    

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 2017-07-02
      相关资源
      最近更新 更多