如何在Go中调整二维数组的大小?

时间:2016-08-06 23:47:22

标签: go

我编写了一个程序,用于读取输入行并检查行是否以#开头 如果是这样,当前行和下一行将保存在二维数组中同一行的两列中:

Go Playground

package main

import (
        "bufio"
        "fmt"
        "strings"
)

func main() {
        const input = "#FooBar1\nFooBar1\n#Foobar2\nFooBar2\n#FooBar3\nFooBar3"

        var multiDimArr [3][2]string
        var lineCount int

        scanner := bufio.NewScanner(strings.NewReader(input))
        for line := 0; scanner.Scan(); line++ {
                if strings.HasPrefix(scanner.Text(), "#") {
                        multiDimArr[line][0] = scanner.Text()
                        scanner.Scan()
                        multiDimArr[line][1] = scanner.Text()
                        lineCount++
                }
        }
        for i := 0; i < lineCount; i++ {
                for j := 0; j < 2; j++ {
                        fmt.Printf("multiDimArr[%d][%d] = %s\n", i, j, multiDimArr[i][j])
                }
        }
}

输出:

multiDimArr[0][0] = #FooBar1
multiDimArr[0][1] = FooBar1
multiDimArr[1][0] = #Foobar2
multiDimArr[1][1] = FooBar2
multiDimArr[2][0] = #FooBar3
multiDimArr[2][1] = FooBar3

我的问题是我在构建程序时需要知道输入中的行数,因此我可以调整multiDimArr的大小。

我可以做任何事情来让它占用任意数量的线路吗?

2 个答案:

答案 0 :(得分:2)

尝试this variation

protocol TestProtocol {

#if TARGET_INTERFACE_BUILDER
    func myControl(control:AnyObject, colorForIndex index:UInt) -> UIColor?
#endif

#if TARGET_INTERFACE_BUILDER
    func myControl(control:AnyObject, textForIndex index:UInt) -> String?
#endif

}

答案 1 :(得分:1)

使用此切片:Authorization: Bearer <token> ,因此您无需计算输入行数:

试试这个有效的示例代码:

[][2]string{}

输出:

package main

import "bufio"
import "fmt"
import "strings"

func main() {
    const input = "#FooBar1\nFooBar1\n#Foobar2\nFooBar2\n#FooBar3\nFooBar3"
    multiDimArr := [][2]string{}
    for i, r := 0, bufio.NewScanner(strings.NewReader(input)); r.Scan(); i++ {
        line1 := r.Text()
        if !strings.HasPrefix(line1, "#") || !r.Scan() {
            break
        }
        multiDimArr = append(multiDimArr, [2]string{line1, r.Text()})
    }
    fmt.Println(multiDimArr)
}

如果您需要预扫描输入以计算行数,您可以使用此工作示例代码,使用[[#FooBar1 FooBar1] [#Foobar2 FooBar2] [#FooBar3 FooBar3]] 将此切片multiDimArr := make([][2]string, n)[][2]string对应:

length = capacity = n

输出:

package main

import "bufio"
import "fmt"
import "strings"

func main() {
    const input = "#FooBar1\nFooBar1\n#Foobar2\nFooBar2\n#FooBar3\nFooBar3"
    n := 0
    for r := bufio.NewScanner(strings.NewReader(input)); r.Scan() && strings.HasPrefix(r.Text(), "#") && r.Scan(); n++ {
    }
    multiDimArr := make([][2]string, n)
    for i, r := 0, bufio.NewScanner(strings.NewReader(input)); r.Scan(); i++ {
        line1 := r.Text()
        if !strings.HasPrefix(line1, "#") || !r.Scan() {
            break
        }
        multiDimArr[i] = [2]string{line1, r.Text()}
    }
    fmt.Println(multiDimArr)
}

Array types

  

长度是数组类型的一部分;它必须评估为   非负constant可由int类型的值表示。

因此,您不能使用数组,因为它的长度是常量,使用[[#FooBar1 FooBar1] [#Foobar2 FooBar2] [#FooBar3 FooBar3]] 会导致编译时错误:multiDimArr := [n][2]string{}

non-constant array bound n