JAVA中的逻辑索引

4

如何在Java中使用逻辑索引访问数组元素?

我想要做的Matlab/Octave等价物:

A = [1 2 3 4 5 6]
logicalarray=[0 1 0 0 0 1];
result= A(logical)

这段代码给出了结果为 result=[2 6]

如果我在Java中有相同的Alogicalarray,那么如何在不使用循环的情况下获取result?


3
你不能直接做到这一点,你必须使用循环——可以手动循环或通过使用流和筛选器隐式地进行循环。 - luk2302
@luk2302 在性能方面,哪一个应该被优先考虑?或者它们都是一样的吗?我们通常会避免在Octave中使用循环以获得更好的性能。你能否提供不同方法的答案?我是Java的新手。 - Likeunknown
1
Java的语法完全不同,你不能像Matlab那样做任何事情,除非你想从Java中调用Matlab代码。https://github.com/diffplug/matconsolectl - Oleg
@deHaar 感谢回复。是的,该数组仅包含0和1。您能否发布一个答案? - Likeunknown
1
我建议你忘掉你对Matlab的所有了解,从头开始学习Java。它没有内置支持矩阵操作,如逻辑掩码。在这之后,你可以研究科学计算库,比如http://nd4j.org/和http://dst.lbl.gov/ACSSoftware/colt/index.html,它们试图提供类似的功能。*附言*:你只能接受一个答案,所以选择你最喜欢的并接受它。你可以点赞任意数量的答案,但在你获得超过15个声望之前,你的点赞不会被计算。 - Oleg
显示剩余3条评论
2个回答

3

如@Oleg所说,Java中的语法与其他语言完全不同。而且,正如@luk2302所提到的,你可能会使用Streams。

以下是代码片段:

int[] a = {1, 2, 3, 4, 5, 6};

// logicalarray=[0 1 0 0 0 1];
// index is zero-based in Java
int[] result = IntStream.of(1, 5)
        .map(i -> a[i])
        .toArray();

System.out.println("result = " + Arrays.toString(result));

将会打印

result = [2, 6]

编辑 如果您需要保留logicalarray,可能的解决方案是

int[] a = {1, 2, 3, 4, 5, 6};
int[] logicalarray = {0, 1, 0, 0, 0, 1};
int[] result = IntStream.range(0, logicalarray.length) // create a stream of array indexes
        .filter(i -> logicalarray[i] == 1) // filter the indexes which are 1 in logicalarray
        .map(i -> a[i]) // map the related value from array a
        .toArray(); // create an array of the values
System.out.println("result = " + Arrays.toString(result));

非常感谢。 - Likeunknown
抱歉,他们不让我选择两个答案。 - Likeunknown
@Ekaba,他们不让我点赞。他们把我的投票记录为反馈。我已经尝试过了。 - Likeunknown
你是怎样引用我的和luk的?你只是复制了链接并添加了[@username](copiedLink)吗?还是有更简单的方法? - Oleg
1
@Oleg 我复制了链接。我不知道在回答中还有其他方法。即使在评论中,你只能针对单个名称使用自动魔法。 - SubOptimal

2
您可以尝试像这样做:

您可以尝试类似以下的操作:

import java.util.Arrays;
import java.util.stream.IntStream;

public class Example {
    public static void main(String[] args) {
        int[] A = {1, 2, 3, 4, 5, 6};
        int[] L = {0, 1, 0, 0, 0, 1};
        int[] n = IntStream.range(0, A.length).map(i -> A[i] * L[i]).filter(i->i>0).toArray();
        System.out.println(Arrays.toString(n));
    }
}

非常感谢。 - Likeunknown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接