在二维数组中获取最大i
,即行数和j
,即列数的最佳和有效方法是什么?
希望在每种情况下,时间复杂度都低于O(n)
。这里没有循环,仍然可以找到最大j
。
例如,如果我有一个这样的数组
[
[18,18,19,19,20,22,22,24,25,26],
[1,2,3],
[0,0,0,0]
]
然后我想在这里得到i = 3
和j = 10
作为结果。
有人能帮我吗?
您的i
是行数,它只是2-D数组的长度
(假设您可以在此计数中包含空行/空行)。
然而,最大行长度j
需要遍历所有行以找到具有最大arr[i].长度
的行i
。
假设您的数组不包含空值,您可以这样写:
private static final Comparator<int[]> lengthComparator = new Comparator<int[]> () {
@Override
public int compare(int[] o1, int[] o2) {
return o1.length - o2.length;
}
};
@Test
public void soArrayMaxLength() {
int[][] array = new int[][] {
{18,18,19,19,20, 22, 22, 24, 25,26},
{1,2,3},
{0,0,0,0}
};
int i = array.length;
Optional<int[]> longestArray =
Arrays.stream(array)
.max(lengthComparator);
int j = longestArray.isPresent() ? longestArray.get().length : 0;
System.out.println(String.format("i=%d j=%d", i, j));
}
如果您碰巧从数组创建了一个并行流,您可以进一步加快速度。
另一种选择是按长度对数组进行排序,快速排序通常具有O(n*log(n))的平均复杂度,因此这并不快;
int i = array.length;
Arrays.parallelSort(array, lengthComparator);
int j = array[i-1].length;
System.out.println(String.format("i=%d j=%d", i, j));
您可以避免自己编写循环,但您无法避免至少有一个<code>O(n)
在Java 8中有一种可能的方法:
Arrays.stream(arr).map(row -> row.length).max(Integer::compare).get();
这将返回2d数组中“行”的最大长度:
10
另一个版本避免使用比较器
,因此可能更容易阅读:
Arrays.stream(arr).mapToInt(row -> row.length).max().getAsInt();
arr
应该是您的源数组。
编辑:旧版本使用<code>。max(Integer::max),这是错误的,会导致错误的结果。有关解释,请参阅此答案。
问题内容: 如果不知道该如何获取数组的第二维?仅给出第一维度。 例如,在 如何获得的第二维的值,即3。 谢谢 问题答案: 哪 三个? 您已经创建了一个多维数组。是一个int数组的数组;您有两个长度为三的数组。 会给你第一个数组的长度。 另外值得注意的是,您不必像以前那样初始化多维数组,这意味着所有数组的长度不必相同(或根本不存在)。
问题内容: 好的,所以我有一个二维数组z [50][50],因此z的大小是50*50,但是如果我说z.length,我只能得到50。如何获得2D数组的实际大小? 问题答案: 在Java中,二维数组实际上是长度可能不同的数组的数组(不能保证在二维数组中第二维数组的长度都相同) 您可以将任何第二维数组的长度作为where 。 如果将二维数组视为矩阵,则可以简单地获取和,但是请注意,您可能会假设第二维的
问题内容: 我想获取所有列的总和,但是我不断收到出站异常。这是我得到的输出: 问题答案: 您的外部for循环条件给您带来了问题。这是您的循环:- 现在,当达到该值时,您正在尝试访问。这将引发异常。 由于每个内部数组的大小都相同,因此可以 将循环更改为 :- 或者,甚至更好的是,只需事先存储一些变量。但这并没有太大的区别。 我还建议您使用更好的方法来计算列的总和。避免首先迭代行。保持迭代正常,大概是
问题内容: 我正在尝试为多维数组中的特定键选择最大值。我无法“找到”有问题的钥匙… 因此,数组(比我在这里发布的要冗长得多) 我试图在整个数组中找到最大的“ dnum”值,因此在此示例中,$ max =2。我知道max函数允许我执行此操作,但是我不确定如何引用dnum。元素而不将整个对象放入foreach循环中,如果我这样做了,那么max不会成为要使用的函数,对吗? 因此,我无法完全做到这一点:
问题内容: 是否有一种简单的方法可以从对象数组列表中的一个对象的字段中获取最大值? 例如,出于下面的对象,我希望获得“值”字段的最高值。 我想从中获取ValuePairs.mValue的最大值的示例arraylist。 创建存储在arraylist中的对象的类: 我正在通过做类似的事情来获取mValue的最大值(我知道这是不正确的): dMax应该为50.00。 任何帮助表示赞赏。谢谢! 问题答案
如何动态调整列的大小以支持可能的不规则数组? 上面的代码会分配每个col的长度吗? 事先谢谢你的帮助。