获取int的第一个数字

时间:2017-08-11 16:51:10

标签: sorting go indexing int

如何按每个int的第一个数字对一片int进行排序?

我正在尝试编写自己的自定义排序:

type ByFirstDigit []int

func (s ByFirstDigit) Len() int {
    return len(s)
}

func (s ByFirstDigit) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}

func (s ByFirstDigit) Less(i, j int) bool {
    return s[i][0] < s[j][0]
}

但是我收到了这个错误:

  

s [j] [0](int类型不支持索引)

3 个答案:

答案 0 :(得分:5)

@RayfenWindspear有最容易使用和阅读的答案,但对性能影响是正确的。如果性能比可维护性更重要,那么使用迭代除法可以做同样的事情来获得最重要的基数10位数:

i

请注意,在循环找到最重要的数字后,您必须在循环外声明 cvtColor(imm,imm,CV_BGR2GRAY); threshold(imm, imm, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); myOCR->SetImage(imm.data, imm.size().width, imm.size().height, imm.channels(), (int) imm.step1()); const char *text1 = myOCR->GetUTF8Text(); 才能使用它。我还会使用您自己的数据集进行基准测试,以了解在您的特定情况下真正的性能影响。

Full playground example, courtesy of Rayfen

答案 1 :(得分:1)

您可以将它们转换为排序函数中的字符串,然后索引第一个字符。对于[]int,您可以使用https://godoc.org/strconv#Itoa。不幸的是,这种方法会对字符串转换产生巨大的性能影响。

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

type ByFirstDigit []int

func (s ByFirstDigit) Len() int {
    return len(s)
}

func (s ByFirstDigit) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}

func (s ByFirstDigit) Less(i, j int) bool {
    si := strconv.Itoa(s[i])
    sj := strconv.Itoa(s[j])
    return si[0] < sj[0]
}

答案 2 :(得分:0)

如果您想要一个具有大量高级数学函数的解决方案,这些函数可能会有效,也可能无效:

package main

import "sort"
import "fmt"
import "math"

type ByFirstDigit []int

func (s ByFirstDigit) Len() int {
    return len(s)
}
func (s ByFirstDigit) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}
func (s ByFirstDigit) Less(i, j int) bool {
    return firstDigit( s[i] ) < firstDigit( s[j] )
}

func firstDigit( x int ) int {
    return int( math.Abs( float64( x ) ) / math.Pow( 10, float64( numDigits(x) - 1 ) ) )
}

func numDigits( x int ) int {
    if ( x == 0 ) { return 1 }
    return int( math.Floor( math.Log10( math.Abs( float64(x) ) ) ) ) + 1
}

func main() {
    ints := []int{3, 20, 400, -500, 101}
    sort.Sort( ByFirstDigit( ints ) )
    fmt.Println( ints )
}

这是一个游乐场(相同的代码): https://play.golang.org/p/uLyBMlra2N