我有一个二维数组,如下所示
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”并停止。因此,使用两个嵌套循环会给我带来一些问题。
如果你想为用户提供一个真正的任意值,我建议你获得所有合适的项目,然后随机获得一个。您可以收集与这样一个一行匹配的所有项目:
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]]);
. findany()
和. findFirst()
流方法不是最好的。它们都是通过查找值而不是索引来工作的。这里最好的方法是迭代你的数组,直到找到你想要的值,并在找到值后停止迭代。你可以照亚历克斯说的做。
如果你知道你的数组是有序的(看起来是这样的),你可以对它进行二进制搜索。首先查看数组的中间部分,然后检查其中的值是否为您的值,或者是否大于或小于该值。
您只需在数组的一侧重复此算法,直到找到值为止。
示例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;
我不知道为什么要使用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阵列保存每个产品的总销售额。•每种产品的日平均销售额周末所有产品的销售总额(假设第六天和第
问题内容: 我有这个多维数组。我需要搜索它,仅返回与“ slug”的值匹配的键。我知道还有其他有关搜索多维数组的线程,但是我对这些情况的理解还不够。非常感谢您的帮助! 所以我需要一个像这样的函数: 这是数组: 问题答案: 很简单: