繁体   English   中英

Java 用另一个大小为 n 的 Boolean 数组过滤数组

[英]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 ,包含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 中的简明代码是什么(不使用循环)?

在 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]

另请参阅:如何使用 Map 按字符串中出现的次数对字符进行排序?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM