@@ -27,7 +27,6 @@ import kotlinx.coroutines.Dispatchers
2727import kotlinx.coroutines.delay
2828import kotlinx.coroutines.launch
2929import java.io.EOFException
30- import java.math.BigInteger
3130import java.net.Inet4Address
3231import java.net.NetworkInterface
3332import java.net.URL
@@ -159,45 +158,72 @@ fun <T> List<T>.at(index: Long): T {
159158 return this [fixedIndex.toInt()]
160159}
161160
162- fun String.parseSortNum (): BigInteger {
163- val numberStr = this .filter { it.isDigit() }.ifEmpty { " 0" }
164- return BigInteger (numberStr)
165- }
161+ fun String.compareByName (b : String ): Int {
162+ val a = this
163+ if (a == b) return 0
166164
167- fun extractNumber (str : String , start : Int ): Long {
168- var result = 0L
169- var i = start
170- while (i < str.length && str[i].isDigit()) {
171- result = result * 10 + (str[i] - ' 0' )
172- i++
173- }
174- return result
175- }
165+ val len1 = a.length
166+ val len2 = b.length
167+ var i = 0
168+ var j = 0
176169
177- fun String.compareByName (str2 : String ): Int {
178- var i1 = 0
179- var i2 = 0
180- val str1 = this
181- while (i1 < str1.length && i2 < str2.length) {
182- // 处理数字部分
183- val char1 = str1[i1]
184- val char2 = str2[i2]
185- if (char1.isDigit() && char2.isDigit()) {
186- val num1 =
187- extractNumber(str1, i1).also { i1 + = it.toString().length }
188- val num2 =
189- extractNumber(str2, i2).also { i2 + = it.toString().length }
190- // 相等则继续提取下个数字进行比较
191- if (num1 != num2) return num1.compareTo(num2)
192- }
193- // 处理非数字部分
194- else {
195- if (char1 != char2) return char1.compareTo(char2)
196- i1++
197- i2++
170+ while (i < len1 && j < len2) {
171+ val c1 = a[i]
172+ val c2 = b[j]
173+
174+ val isDig1 = c1 in ' 0' .. ' 9'
175+ val isDig2 = c2 in ' 0' .. ' 9'
176+
177+ if (isDig1 && isDig2) {
178+ val start1 = i
179+ val start2 = j
180+
181+ // 跳过前导零,但保留最后一个零(如果是全零或数字结尾)
182+ while (i < len1 - 1 && a[i] == ' 0' && a[i + 1 ] in ' 0' .. ' 9' ) i++
183+ while (j < len2 - 1 && b[j] == ' 0' && b[j + 1 ] in ' 0' .. ' 9' ) j++
184+
185+ val valStart1 = i
186+ val valStart2 = j
187+
188+ // 计算数字部分的长度
189+ while (i < len1 && a[i] in ' 0' .. ' 9' ) i++
190+ while (j < len2 && b[j] in ' 0' .. ' 9' ) j++
191+
192+ val numLen1 = i - valStart1
193+ val numLen2 = j - valStart2
194+
195+ // 1. 比较数字长度(位数多者大)
196+ if (numLen1 != numLen2) return numLen1 - numLen2
197+
198+ // 2. 长度相同时,逐位比较数值大小
199+ for (k in 0 until numLen1) {
200+ val diff = a[valStart1 + k] - b[valStart2 + k]
201+ if (diff != 0 ) return diff
202+ }
203+
204+ // 3. 数值完全一样,比较包含前导零的原始长度
205+ val fullLen1 = i - start1
206+ val fullLen2 = j - start2
207+ if (fullLen1 != fullLen2) return fullLen1 - fullLen2
208+
209+ } else {
210+ // 非数字部分比较
211+ if (c1 != c2) {
212+ // 模拟 case-insensitive 比较 (仅针对 ASCII)
213+ val low1 = if (c1 in ' A' .. ' Z' ) c1 + 32 else c1
214+ val low2 = if (c2 in ' A' .. ' Z' ) c2 + 32 else c2
215+
216+ if (low1 != low2) return low1 - low2
217+ // 小写相同但原始字符不同(如 'a' vs 'A')
218+ return c1 - c2
219+ }
220+ i++
221+ j++
198222 }
199223 }
200- return str1.length.compareTo(str2.length)
224+
225+ // 4. 若前面都相同,则短串在前
226+ return len1 - len2
201227}
202228
203229fun <T > List<T>.at (index : Int ): T {
0 commit comments