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,包含 true
或 false
。
基于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 的布尔数组过滤数组的主要内容,如果未能解决你的问题,请参考以下文章