[英]Java Filter an array by another Boolean array of size n
我是 Java 的新手。 我有一个大小为 n 的数组Arr
,这个数组Arr
可能包含,比如说,double。 (此数组可能是另一种类型:例如 integer、字符串或任何其他 object: double[]
、 int[]
或List<Object>
)。
我有另一个大小为 n 的 Boolean 数组BooArr
,包含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 中的简明代码是什么(不使用循环)?
在 Java 的限制下, arr
只能包含一个类型...
IntStream.range(0, n).filter(i -> booArr[i])
.mapToObj(n -> arr[n]).[some terminal operation]
从所有数组索引的序列开始, select 仅映射到true
中的那些索引,然后booArr
来自arr
的那些索引并应用您选择的终端操作。
您可以使用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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.