我想逐个比较 2 个字符串,以查看按任意字母顺序排列的第一个字符串。现在我有这个实现,它存储在map[rune]int一个映射中,表示我的字母表中的字母顺序。我有这个工作代码。我很清楚当前设计中的缺陷,但这不是问题的重点。package mainimport ( "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 的唯一方法。
2 回答
胡子哥哥
TA贡献1825条经验 获得超6个赞
您可以使用两个单词之一的范围使循环更加地道。这需要在循环中添加检查,但您不再需要在最终返回时执行检查。
// determines if the word indexed at i is less than the word indexed at j.
func (d Dictionnary) Less(i, j int) bool {
wordi, wordj := []rune(d.content[i]), []rune(d.content[j])
for i, c := range wordi {
if i == len(wordj) {
return false
}
diff := d.comesFirst(c, wordj[i])
switch {
case diff < 0:
return true
case diff > 0:
return false
default:
continue
}
}
return false
}
- 2 回答
- 0 关注
- 184 浏览
添加回答
举报
0/150
提交
取消