java—按某个值过滤2d数组的行

6qqygrtg  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(405)

我是java的初学者。为了我的任务,我得到了这样一张table。表中有6名选手参加了7场比赛。每个单元格中的值是他们在特定比赛中获得的位置:

我的程序的任务是打印出在至少一场比赛中获得第一名的跑步者的数量。我成功地写了一个代码来计算所有跑步者获得的第一名的数量,但是我正在努力找到一个解决方案,如何将那些多次获得第一名的跑步者添加到只计算一次的数量中。找到匹配值并将其添加到计数后,如何迭代到下一行?以下是我目前的代码:

public class MyClass {
    public static void main(String[] args) {
        int A[][] = {{21, 14, 1, 21, 19, 5, 2},
                {4, 27, 1, 7, 25, 19, 19},
                {12, 20, 25, 11, 30, 14, 15},
                {5, 8, 5, 7, 1, 2, 13},
                {20, 2, 14, 4, 25, 1, 1},
                {14, 20, 20, 15, 11, 18, 16}};

        int i, j;
        int counter = 0;

        System.out.println("result:");
        for (i = 0; i < 6; i++) {
            for (j = 0; j < 7; j++) {
                if (A[i][j] == 1) {
                    counter++;
                }
            }
        }
        System.out.print(counter);
    }
}
vxbzzdmp

vxbzzdmp1#

您可以在 range 矩阵的行索引,以及 filter 把那些包含 anyMatch1 :

int[][] runners = {
        {21, 14, 1, 21, 19, 5, 2},
        {4, 27, 1, 7, 25, 19, 19},
        {12, 20, 25, 11, 30, 14, 15},
        {5, 8, 5, 7, 1, 2, 13},
        {20, 2, 14, 4, 25, 1, 1},
        {14, 20, 20, 15, 11, 18, 16}};

int[] winners = IntStream
        // iterate over indices of
        // the rows of 2d array
        .range(0, runners.length)
        // filer rows where at least
        // one element matches '1'
        .filter(i -> Arrays.stream(runners[i])
                .anyMatch(j -> j == 1))
        // array of indices
        .toArray();

System.out.println(Arrays.toString(winners)); // [0, 1, 3, 4]
yuvru6vn

yuvru6vn2#

要跟踪在比赛中已经获得第一名的跑步者,可以使用如下布尔数组

boolean[] firstPlaceRunner = new boolean[A[0].length];

上述布尔数组的第i个位置存储以下信息:
如果第i名选手在任何一场比赛中获得第一名。
错误-如果第i名选手无法在任何比赛中获得第一名。
因此,现在在您的代码中,您只能在当前运行程序尚未获得第一名时递增计数器。您的代码如下所示:

public static void main(String[] args) {
    int[][] A = {{21, 14, 1, 21, 19, 5, 2},
            {4, 27, 1, 7, 25, 19, 19},
            {12, 20, 25, 11, 30, 14, 15},
            {5, 8, 5, 7, 1, 2, 13},
            {20, 2, 14, 4, 25, 1, 1},
            {14, 20, 20, 15, 11, 18, 16}};
    int counter = 0;
    // A[0].length gives the number of runner in any race
    boolean[] firstPlaceRunner = new boolean[A[0].length];
    for (int i = 0; i < 6; i++) {
        for (int j = 0; j < 7; j++) {
            if (A[i][j] == 1) {
                if (!firstPlaceRunner[j]) {
                    counter++;
                    // because now jth runner has secured first
                    // place, and in future we don't want to
                    firstPlaceRunner[j] = true;
                    // double count it
                }
            }
        }
    }
    System.out.println("result:");
    System.out.print(counter);
}

注意:作为对我们算法的改进,您可以 break 因为只能有一个第一名优胜者,所以在代码中的下一行后面的语句:

firstPlaceRunner[j] = true;
break;

所以基本上,你是说,如果我们已经找到了一个给定比赛的第一名,那么就不要检查其他选手。

r1wp621o

r1wp621o3#

在if语句中添加中断符。

public class MyClass {
public static void main(String[] args) {
    int A[][] = {{21, 14, 1, 21, 19, 5, 2},
            {4, 27, 1, 7, 25, 19, 19 },
            {12, 20, 25, 11, 30, 14, 15},
            {5, 8, 5, 7, 1, 2, 13},
            {20, 2, 14, 4, 25, 1, 1},
            {14, 20, 20, 15, 11, 18, 16}};
    int i, j;
    int counter = 0;

    System.out.println("result:");
    for (i=0; i<6; i++) {
        for (j=0; j<7; j++) {
            if (A[i][j] == 1) {
                counter++;
                break;
            }
        }

        }
    System.out.print(counter);
    }
}

相关问题