假设我们有一个二维阵列
int[][] arr = new int[][] { { 1, 2 }, { 3, 4, 5 }, { 6, 7 }, { 8, 9 } };
在此处,arr[1]
的长度为3
。
有没有有效的方法来检查2-d阵列中存在的所有1-d阵列是否具有相同的长度?
比如说,没有循环遍历数组,或者可能是通过使用任何可以首选而不是int[][]
的数据结构?
答案 0 :(得分:2)
如果使用java8,下面的代码(查看内联注释)要简单得多,它使用基本的stream
(即内部迭代)方法:
int[][] arr = new int[][] { { 1, 2 }, { 3, 4}, { 6, 7 }, { 8, 9 } };
final int[] firstSubArray = arr[0];//get the first array size
//Now with stream skip first element & check the size with rest
boolean isSubArraysSameSize = Arrays.stream(arr).//get stream from array
skip(1).//skip first element
allMatch(subArray ->
subArray.length == firstSubArray.length);//check rest all sizes match
System.out.println(isSubArraysSameSize);
答案 1 :(得分:1)
鉴于您没有在施工时间等处进行一些簿记,您无法避免将其变为 O(n)算法 n 行数。例如:
public static boolean sameLengths(int[][] matrix) {
if(matrix == null) {
return false;
}
if(matrix.length > 0) {
if(matrix[0] == null) {
return false;
}
int n = matrix[0].length;
for(int[] row : matrix) {
if(row == null || row.length != n) {
return false;
}
}
}
return true;
}
边缘案例是如何处理 null
值以及带有无行的矩阵的内容。在这里我决定:
null
矩阵返回false
; null
的矩阵也会返回false
;和true
(因为在这种情况下,所有行的长度都相同)。如果你以不同的方式处理这些边缘情况,很容易改变实现。
答案 2 :(得分:1)
在评论中,您说我们可以使用列表。因此,请检查添加新列表时的长度差异。之后,获得答案将花费O(1):
class DataWrapper {
private List<List<Integer>> data = new ArrayList<>();
private List<Integer> lastAdded;
private boolean isDifferentLength;
public void add(List<Integer> newList) {
if (data.add(newList)) {
if (!isDifferentLength && isDifferentLengthWith(newList)) {
isDifferentLength = true;
}
lastAdded = newList;
}
}
private boolean isDifferentLengthWith(List<Integer> newList) {
return lastAdded != null && lastAdded.size() != newList.size();
}
public boolean isDifferentLength() {
return isDifferentLength;
}
}