【问题标题】:Java List, Counting non-zero attributes of Object, by group of 3Java 列表,按 3 组计算对象的非零属性
【发布时间】:2015-07-14 15:29:27
【问题描述】:

我有一个 ArrayList<Fileline> 和内部 Fileline 一个函数

public Double getValue() {
    ...
    doing stuff
    ...
    return value;
}

我要做的是返回一组 3 个文件行中任何非零 getValue()count

假设我有List<Fileline> filelinesfilelines.size() = 12,它们各自的getValue()0,0,0, 0,1,2, 0,3,0, 4,5,5,那么我想要的result 是3,除了第一组之外都是有效的。

如果它是一组 1 个文件行,我可以像这样 filtercount

long resultCount = filelines.stream().filter(x -> x.getValue() > 0).count();

,但它是由 3 人一组的事实给我带来了问题。

是将列表拆分为多个 3 元素子列表的最佳方法还是更优雅的方法?

【问题讨论】:

  • 你的问题没有意义。请记住,我们看不到您的代码库。请尽量说清楚。 Fileline 是什么?这是从文件中读取的行吗? ElementId 是什么? ArrayList 包含什么?每个索引位置是否包含 1 行?逗号分隔符是怎么回事?等等..
  • @CKing 我会尝试改变我的问题,但它确实与我的对象无关。事实上,我可以删除 ElementID 而不改变任何问题
  • 您可以控制文件的格式吗?如果是这样,以不同的方式格式化文件会不会更容易?
  • @Benoit 只需发布构成问题的最基本信息。如果ElementId 不重要,那就去掉它。解释我们不知道的其余部分。我仍然很困惑。 假设我有 12 个 Fileline 和它们各自的 getValue。这是什么意思? 如果是我可以过滤和计数的每个文件行。这是什么意思?
  • 将任务拆分为三个简单的子任务: 1. 创建一个类 FileLineGroup,包含 3 个 FileLines,以及一个返回布尔值的方法 hasNonZeroValue(); 2. 将包含 12 个元素的 List 转换为包含 4 个元素的 List。过滤并计算该列表。

标签: java arraylist collections filter java-stream


【解决方案1】:

您可以将索引范围映射到子列表的三个分组,如下所示:

List<Fileline> filtered = IntStream.range(0, list.size()/3)
    .mapToObj(n -> list.subList(n*3, n*3+3))
    .filter(subList -> subList.stream().anyMatch(fl -> fl.getValue() != 0.0))
    .flatMap(List::stream)
    .collect(Collectors.toList());

我假设您想将组展平,所以我添加了flatMap 步骤。或者,如果您的情况更好,您可以将它们分组:

List<List<Fileline>> filtered = IntStream.range(0, list.size()/3)
    .mapToObj(n -> list.subList(n*3, n*3+3))
    .filter(subList -> subList.stream().anyMatch(fl -> fl.getValue() != 0.0))
    .collect(Collectors.toList());

如果您只需要统计这些组,请将collect 步骤替换为count 并将映射和过滤器合并为单个步骤:

long count = IntStream.range(0, list.size()/3)
    .filter(n -> list.subList(n*3, n*3+3).stream().anyMatch(fl -> fl.getValue() != 0.0))
    .count();

【讨论】:

  • 如果我理解正确的话,最后两个操作应该用 count() 代替。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多