在go中查找2D切片的长度

时间:2015-11-21 20:50:38

标签: arrays matrix multidimensional-array go slice

我想检查矩阵是否大小相同:如果两个矩阵的行数相同且列数相同。

matrix1 := [][]int{{1,2,3} ,{4,5,6}}
matrix2 := [][]int{{7,8,9}, {10,11,12}}

我得到len(matrix1) == len(matrix2) == 2。哪个是正确的行数。

如果我如上所示声明矩阵,我如何检查每一行的长度(即列数,应为3)?

1 个答案:

答案 0 :(得分:4)

请注意,由于2D切片中的每个“行”可能具有任意长度,因此如果它们相等,则应检查每个相应行(具有相同索引)的长度。

这是一个能够做到这一点的功能:

func match(m1, m2 [][]int) bool {
    if len(m1) != len(m2) {
        return false
    }

    for i, row1 := range m1 {
        row2 := m2[i]
        if len(row1) != len(row2) {
            return false
        }
    }

    return true
}

参见用法示例:

m1 := [][]int{{1, 2, 3}, {4, 5, 6}}
m2 := [][]int{{7, 8, 9}, {10, 11, 12}}
fmt.Println(match(m1, m2))

m1 = [][]int{{1, 2, 3}, {4, 5, 6, 7, 8}}
m2 = [][]int{{7, 8, 9}, {10, 11, 12, 12, 13}}
fmt.Println(match(m1, m2))

m1 = [][]int{{1, 2, 3}, {4, 5, 6, 7, 8}}
m2 = [][]int{{7, 8, 9}, {10, 11, 12, 12}}
fmt.Println(match(m1, m2))

m1 = [][]int{{1, 2, 3}}
m2 = [][]int{{7, 8, 9}, {10, 11, 12, 12}}
fmt.Println(match(m1, m2))

输出(如预期):

true
true
false
false

特殊情况的简化:

如果您保证在所有矩阵中所有行都具有相同的长度,则可以进行大的简化:在这种情况下,如果行数匹配,则足以比较每行的一行的长度矩阵,几乎是第一行。

看起来像这样:

func match2(m1, m2 [][]int) bool {
    if len(m1) != len(m2) {
        return false
    }
    return len(m1) == 0 || len(m1[0]) == len(m2[0])
}

测试它:

m1 = [][]int{{1, 2, 3}, {4, 5, 6}}
m2 = [][]int{{7, 8, 9}, {10, 11, 12}}
fmt.Println(match2(m1, m2))

m1 = [][]int{{1, 2, 3, 4}, {5, 6, 7, 8}}
m2 = [][]int{{7, 8, 9}, {10, 11, 12}}
fmt.Println(match2(m1, m2))

输出:

true
false

Go Playground 上试试这些。