如何按每个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类型不支持索引)
答案 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();
才能使用它。我还会使用您自己的数据集进行基准测试,以了解在您的特定情况下真正的性能影响。
答案 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