检查2-d数组内的各个数组是否具有相同长度的有效方法

时间:2017-04-01 20:00:48

标签: java arrays

假设我们有一个二维阵列 int[][] arr = new int[][] { { 1, 2 }, { 3, 4, 5 }, { 6, 7 }, { 8, 9 } };
在此处,arr[1]的长度为3

有没有有效的方法来检查2-d阵列中存在的所有1-d阵列是否具有相同的长度?

比如说,没有循环遍历数组,或者可能是通过使用任何可以首选而不是int[][]的数据结构?

3 个答案:

答案 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;
    }
}