Java 通过另一个大小为 n 的布尔数组过滤数组

Posted

技术标签:

【中文标题】Java 通过另一个大小为 n 的布尔数组过滤数组【英文标题】:Java Filter an array by another Boolean array of size n 【发布时间】:2021-05-31 05:08:47 【问题描述】:

我是 Java 新手。我有一个大小为 n 的数组Arr,这个数组Arr 可能包含,比如说,double。 (此数组可能是其他类型:例如整数、字符串或任何其他对象:double[]int[]List<Object>)。

我有另一个布尔数组 BooArr,大小为 n,包含 truefalse

基于BooArr 过滤Arr 的最简洁代码是什么。 在 matlab/python 中,这将非常简单:ValidArrElements = Arr[BooArr]。 例如。 Arr = [1, 2.0, -1, 3]BooArr = [true, true, false, true]ValidArrElements 将是 [1, 2.0, 3]

Java 中的简洁代码是什么(不使用循环)?

【问题讨论】:

【参考方案1】:

在 Java 中,arr 只能包含一个类型的限制...

IntStream.range(0, n).filter(i -> booArr[i])
        .mapToObj(n -> arr[n]).[some terminal operation]

从所有数组索引的序列开始,在booArr 中仅选择映射到true 的索引,然后从arr 中选择这些索引并应用您选择的终端操作。

【讨论】:

【参考方案2】:

您可以使用IntStream 过滤这两个数组:

// assume that two arrays have the same
// length, or 'booArr' is less than 'arr'
Object[] arr = new Object[]1, 2.0, -1, 3;
Boolean[] booArr = true, true, false, true;

Object[] validArr = IntStream
        // iterate through array indexes
        .range(0, booArr.length)
        // filter trues
        .filter(i -> booArr[i])
        // take values that are true
        .mapToObj(i -> arr[i])
        // return an array
        .toArray();

// output
System.out.println(Arrays.toString(validArr));
// [1, 2.0, 3]

如果你有两个列表,方法是一样的:

// assume that two lists have the same
// length, or 'booList' is less than 'list'
List<Object> list = List.of(1, 2.0, -1, 3);
List<Boolean> booList = List.of(true, true, false, true);

List<Object> validList = IntStream
        // iterate through list indexes
        .range(0, booList.size())
        // filter trues
        .filter(booList::get)
        // take values that are true
        .mapToObj(list::get)
        // return a List<Object>
        .collect(Collectors.toList());

// output
System.out.println(validList);
// [1, 2.0, 3]

另见:How to sort a character by number of occurrences in a String using a Map?

【讨论】:

以上是关于Java 通过另一个大小为 n 的布尔数组过滤数组的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个函数访问布尔数组? C++

通过布尔掩码数组选择numpy数组的元素

布尔数组的排列

Vue.js - 通过另一个 JSON 数组过滤 JSON 数组

如何通过来自另一个对象数组的数据过滤对象数组? [关闭]

ES6 常用的数组函数(附加for)