在 go 中迭代 2 个字符串

我想逐个比较 2 个字符串,以查看按任意字母顺序排列的第一个字符串。


现在我有这个实现,它存储在map[rune]int一个映射中,表示我的字母表中的字母顺序。


我有这个工作代码。我很清楚当前设计中的缺陷,但这不是问题的重点。


package main


import (

    "bufio"

    "log"

    "math/rand"

    "os"

    "sort"

)


type Dictionnary struct {

    content           []string

    alphaBeticalOrder map[rune]int

}


func minSize(w1, w2 []rune) int {

    if len(w1) < len(w2) {

        return len(w1)

    }

    return len(w2)

}


func (d *Dictionnary) comesFirst(a, b rune) int {


    return d.alphaBeticalOrder[a] - d.alphaBeticalOrder[b]

}


func (d Dictionnary) Less(i, j int) bool {

    wordi, wordj := []rune(d.content[i]), []rune(d.content[j])

    size := minSize(wordi, wordj)

    for index := 0; index < size; index++ {

        diff := d.comesFirst(wordi[index], wordj[index])

        switch {

        case diff < 0:

            return true

        case diff > 0:

            return false

        default:

            continue

        }

    }

    return len(wordi) < len(wordj)

}


func (d Dictionnary) Swap(i, j int) {

    d.content[i], d.content[j] = d.content[j], d.content[i]

}


func (d Dictionnary) Len() int {

    return len(d.content)

}


func main() {


    letters := []rune{'z', 'y', 'x', 'w', 'v', 'u', 't', 's', 'r', 'q', 'p', 'o', 'n', 'm', 'l', 'k', 'j', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a'}

    aOrder := make(map[rune]int)

    perm := rand.Perm(len(letters))

    for i, v := range perm {

        aOrder[letters[i]] = v

    }


    file, err := os.Open("testdata/corpus.txt")

    if err != nil {

        log.Fatal(err)

    }


    corpus := make([]string, 0, 1000)

    scanner := bufio.NewScanner(file)

    for scanner.Scan() {

        corpus = append(corpus, scanner.Text())

    }


    if err := scanner.Err(); err != nil {

        log.Fatal(err)

    }


我的问题与Less(i,j int) bool功能有关。是否有更惯用的方法来迭代 2 个字符串以逐个比较它们?我在这里制作了一份数据副本,这可能是可以避免的。


编辑:澄清我的问题是 range(string) 可以允许您逐个迭代字符串 rune,但我看不到并排迭代 2 个字符串的方法。我认为将字符串转换为 []rune 的唯一方法。


互换的青春
浏览 185回答 2
2回答

胡子哥哥

您可以使用两个单词之一的范围使循环更加地道。这需要在循环中添加检查,但您不再需要在最终返回时执行检查。// determines if the word indexed at i is less than the word indexed at j.func (d Dictionnary) Less(i, j int) bool {&nbsp; &nbsp; wordi, wordj := []rune(d.content[i]), []rune(d.content[j])&nbsp; &nbsp; for i, c := range wordi {&nbsp; &nbsp; &nbsp; &nbsp; if i == len(wordj) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; diff := d.comesFirst(c, wordj[i])&nbsp; &nbsp; &nbsp; &nbsp; switch {&nbsp; &nbsp; &nbsp; &nbsp; case diff < 0:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true&nbsp; &nbsp; &nbsp; &nbsp; case diff > 0:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; &nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return false}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go