Просмотр исходного кода

Fix instability in key ordering.

Gustavo Niemeyer 7 лет назад
Родитель
Сommit
cdc409dda4
2 измененных файлов с 10 добавлено и 1 удалено
  1. 3 0
      encode_test.go
  2. 7 1
      sorter.go

+ 3 - 0
encode_test.go

@@ -612,6 +612,9 @@ func (s *S) TestSortedOutput(c *C) {
 		"d7abc",
 		"d7abc",
 		"d12",
 		"d12",
 		"d12a",
 		"d12a",
+		"e2b",
+		"e4b",
+		"e21a",
 	}
 	}
 	m := make(map[interface{}]int)
 	m := make(map[interface{}]int)
 	for _, k := range order {
 	for _, k := range order {

+ 7 - 1
sorter.go

@@ -52,8 +52,10 @@ func (l keyList) Less(i, j int) bool {
 		return ak < bk
 		return ak < bk
 	}
 	}
 	ar, br := []rune(a.String()), []rune(b.String())
 	ar, br := []rune(a.String()), []rune(b.String())
+	digits := false
 	for i := 0; i < len(ar) && i < len(br); i++ {
 	for i := 0; i < len(ar) && i < len(br); i++ {
 		if ar[i] == br[i] {
 		if ar[i] == br[i] {
+			digits = unicode.IsDigit(ar[i])
 			continue
 			continue
 		}
 		}
 		al := unicode.IsLetter(ar[i])
 		al := unicode.IsLetter(ar[i])
@@ -62,7 +64,11 @@ func (l keyList) Less(i, j int) bool {
 			return ar[i] < br[i]
 			return ar[i] < br[i]
 		}
 		}
 		if al || bl {
 		if al || bl {
-			return bl
+			if digits {
+				return al
+			} else {
+				return bl
+			}
 		}
 		}
 		var ai, bi int
 		var ai, bi int
 		var an, bn int64
 		var an, bn int64