当前位置: 首页 > 知识库问答 >
问题:

如何使用findAny()在二维数组中查找特定值

胥承
2023-03-14

我有一个二维数组,如下所示

int[][] seatsPrices = {{10,10,10,10,10,10,10,10,10,10},
                        {10,10,10,10,10,10,10,10,10,10},
                        {10,10,10,10,10,10,10,10,10,10},
                        {10,10,20,20,20,20,20,20,10,10},
                        {10,10,20,20,20,20,20,20,10,10},
                        {10,10,20,20,20,20,20,20,10,10},
                        {20,20,30,30,40,40,30,30,20,20},
                        {20,30,30,40,50,50,40,30,30,20},
                        {30,40,50,50,50,50,50,50,40,30}};

我要求用户给出一个数字。假设他给了20分。因此,我想编写代码,以迭代方式将该值与seatsPrices数组进行比较,并找到seatsPrices数组的任何I,j索引,其值为20,然后将其打印出来。我可能应该使用findAny(),但我不知道如何使用它。注意:我只需要找到一个“20”并停止。因此,使用两个嵌套循环会给我带来一些问题。

共有3个答案

谷梁裕
2023-03-14

如果你想为用户提供一个真正的任意值,我建议你获得所有合适的项目,然后随机获得一个。您可以收集与这样一个一行匹配的所有项目:

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class SpecificValueIn2DArray {
    static int[][] seatsPrices = {{10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
    {10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
    {10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
    {10, 10, 20, 20, 20, 20, 20, 20, 10, 10},
    {10, 10, 20, 20, 20, 20, 20, 20, 10, 10},
    {10, 10, 20, 20, 20, 20, 20, 20, 10, 10},
    {20, 20, 30, 30, 40, 40, 30, 30, 20, 20},
    {20, 30, 30, 40, 50, 50, 40, 30, 30, 20},
    {30, 40, 50, 50, 50, 50, 50, 50, 40, 30}};

public List<int[]> getItemIndexCollection(int itemValue) {
    return IntStream.range(0, seatsPrices.length)
        .boxed()
        .flatMap(i ->
            IntStream.range(0, seatsPrices[i].length)
                .boxed()
                .map(j -> seatsPrices[i][j] == itemValue ? new int[]{i, j} : new int[]{-1, -1})
        )
        .filter(item -> item[0] != -1 && item[1] != -1)
        .collect(Collectors.toList());
}

}

并从结果列表中获取一个随机元素

    final var actualResult = new SpecificValueIn2DArray().getItemIndexCollection(itemValue);
    final var random = new Random();
    final var pair = actualResult.get(random.nextInt(actualResult.size()));
    System.out.println(pair[0] + " " + pair[1]);
    System.out.println(SpecificValueIn2DArray.seatsPrices[pair[0]][pair[1]]);
东郭良弼
2023-03-14

. findany(). findFirst()方法不是最好的。它们都是通过查找值而不是索引来工作的。这里最好的方法是迭代你的数组,直到找到你想要的值,并在找到值后停止迭代。你可以照亚历克斯说的做。

如果你知道你的数组是有序的(看起来是这样的),你可以对它进行二进制搜索。首先查看数组的中间部分,然后检查其中的值是否为您的值,或者是否大于或小于该值。

  • 如果值(数组中间)是您的值(20),则搜索结束

您只需在数组的一侧重复此算法,直到找到值为止。

示例1D算法:

int binarySearch(int arr[], int lIndex, int rIndex, int searchValue)
{
    if (rIndex >= lIndex) {
        int pivot = lIndex + (rIndex - lIndex) / 2;
        if (arr[pivot] == searchValue)
            return pivot;
        if (arr[pivot] > searchValue)
            return binarySearch(arr, lIndex, pivot - 1, searchValue);
        return binarySearch(arr, pivot + 1, rIndex, searchValue);
    }
    return -1;
}

您可以将二维数组展开为一维数组并获取索引,而不仅仅是将索引重新映射到二维索引:

x = index / size;
y = index % size;
晋天逸
2023-03-14

我不知道为什么要使用findAny(),只要在数组上迭代,搜索20,并在遇到I,j时打印出I,j,似乎就简单多了。

for (int i = 0; i < seatPrices.length; i++) {
    for (int j = 0; j < seatPrices[0].length; j++) {
        if (seatPrices[i][j] == 20) 
            System.out.println(i + " " + j);
    }
}

如果你对数组有任何了解(比如它们被排序),你可以想出一个更快的算法来找到索引。

如果只想找到一个:

boolean found = false;
for (int i = 0; i < seatPrices.length && !found; i++) {
    for (int j = 0; j < seatPrices[0].length && !found; j++) {
        if (seatPrices[i][j] == 20) {
            System.out.println(i + " " + j);
            found = true;
        }
    }
}
 类似资料:
  • 问题内容: 是否有一种简单的方法来查找二维数组中某个元素的邻居(即,元素周围的八个元素)?缺少只是以不同的组合减去和增加索引,像这样: … 等等。 问题答案: (伪代码) 当然,这几乎要花费原始硬编码解决方案的许多行,但是通过这一解决方案,您可以最大程度地扩展“邻居”(2-3个或更多单元格)

  • 题目链接 牛客网 题目描述 给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。 // html Consider the following matrix: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17,

  • 问题内容: 我想定义一个没有初始化长度的二维数组,如下所示: 但这不起作用… 我已经尝试过下面的代码,但是它也是错误的: 错误: 我怎么办呢? 问题答案: 从技术上讲,你正在尝试索引未初始化的数组。你必须先使用列表初始化外部列表,然后再添加项目。Python将其称为“列表理解”。 你现在可以将项目添加到列表中: 请注意,矩阵是地址主地址,换句话说,“ y索引”位于“ x索引”之前。 尽管你可以根据

  • 一、题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 二、解题思路 首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束。 如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行。 也就是说如果要查找的数字不在数组的

  • 我无法让我的数组总结出特定的部分。 以下是我的课程说明: 编写一个程序来准备公司销售报告•该程序要求用户输入一周内三种产品的每日销售额。对3种产品和7天使用双2D阵列展示每种产品的销售额。然后,程序计算并显示以下内容:•一周内所有三种产品的销售总额。•所有产品的日平均销售额。•每种产品一周的销售总额。使用1D阵列保存每个产品的总销售额。•每种产品的日平均销售额周末所有产品的销售总额(假设第六天和第

  • 问题内容: 我想获取与行匹配的二维Numpy数组的索引。例如,我的数组是这样的: 我想获取与行[0,1]相匹配的索引,该行是索引3和15。当我执行类似的操作时,… 我想要索引数组([3,15])。 问题答案: 您需要使用函数来获取索引: 或者,如文档所述: 如果仅给出条件,则返回 您可以直接调用返回的数组: 分解: 并在该数组上调用方法(使用)可为您提供两个均为True的位置: 并获取哪些索引是: