首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Golang中,如何在不完全忽略大小写的情况下按字母顺序对字符串列表进行排序?

在Golang中,如何在不完全忽略大小写的情况下按字母顺序对字符串列表进行排序?
EN

Stack Overflow用户
提问于 2016-01-29 10:57:13
回答 3查看 13.6K关注 0票数 6

我希望字符串按字母顺序排序,并控制"a“是否在"A”之前。

在Less()函数中,使用strings.ToLower()不能做到这一点。有时"a“在"A”之前,有时在“a”之后。

EN

回答 3

Stack Overflow用户

发布于 2016-01-29 22:39:11

不是使用strings.ToLower比较整个字符串,而是比较各个符文。

https://play.golang.org/p/RUMlmrb7C3g

代码语言:javascript
运行
复制
type ByCase []string

func (s ByCase) Len() int      { return len(s) }
func (s ByCase) Swap(i, j int) { s[i], s[j] = s[j], s[i] }

func (s ByCase) Less(i, j int) bool {
    iRunes := []rune(s[i])
    jRunes := []rune(s[j])

    max := len(iRunes)
    if max > len(jRunes) {
        max = len(jRunes)
    }

    for idx := 0; idx < max; idx++ {
        ir := iRunes[idx]
        jr := jRunes[idx]

        lir := unicode.ToLower(ir)
        ljr := unicode.ToLower(jr)

        if lir != ljr {
            return lir < ljr
        }

        // the lowercase runes are the same, so compare the original
        if ir != jr {
            return ir < jr
        }
    }

    // If the strings are the same up to the length of the shortest string, 
    // the shorter string comes first
    return len(iRunes) < len(jRunes)
}
票数 6
EN

Stack Overflow用户

发布于 2016-01-30 15:56:17

这可能是一种解决方案:

代码语言:javascript
运行
复制
package main

import (
    "strings"
    "sort"
    "fmt"
)

var listOfStrings []string = []string{
    "mars bar",
    "milk-duds",
    "Mars bar",
    "milk",
    "milky-way",
    "Milk",
    "Milky-way",
    "mars",
}

type Alphabetic []string

func (list Alphabetic) Len() int { return len(list) }

func (list Alphabetic) Swap(i, j int) { list[i], list[j] = list[j], list[i] }

func (list Alphabetic) Less(i, j int) bool {
    var si string = list[i]
    var sj string = list[j]
    var si_lower = strings.ToLower(si)
    var sj_lower = strings.ToLower(sj)
    if si_lower == sj_lower {
        return si < sj
    }
    return si_lower < sj_lower
}

func main() {
    fmt.Println("UNSORTED")
    printStrings(listOfStrings)
    sort.Sort(Alphabetic(listOfStrings))
    fmt.Println()
    fmt.Println("SORTED ALPHABETICALLY")
    printStrings(listOfStrings)
}

func printStrings(slice []string) {
    for i := 0; i < len(slice); i++ {
        fmt.Println(slice[i])
    }
}

下面是输出:

代码语言:javascript
运行
复制
UNSORTED
mars bar
milk-duds
Mars bar
milk
milky-way
Milk
Milky-way
mars

SORTED ALPHABETICALLY
mars
Mars bar
mars bar
Milk
milk
milk-duds
Milky-way
milky-way
票数 5
EN

Stack Overflow用户

发布于 2021-04-23 08:41:56

下面是一个使用strings.Map的Unicode友好方法

代码语言:javascript
运行
复制
package main

import (
   "fmt"
   "sort"
   "strings"
   "unicode"
)

type slice struct { sort.StringSlice }

func (s slice) Less(d, e int) bool {
   t := strings.Map(unicode.ToUpper, s.StringSlice[d])
   u := strings.Map(unicode.ToUpper, s.StringSlice[e])
   return t < u
}

func main() {
   a := slice{
      sort.StringSlice{"a", "b", "A", "B"},
   }
   sort.Sort(a)
   fmt.Println(a.StringSlice) // [a A b B]
}

https://golang.org/pkg/strings#Map

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35076109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档