Skip to content

Commit ca9d68a

Browse files
committed
2.0.9
1 parent f70b9c4 commit ca9d68a

2 files changed

Lines changed: 64 additions & 38 deletions

File tree

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ android {
1717
applicationId = "com.donut.mixfile"
1818
minSdk = 26
1919
targetSdk = 36
20-
versionCode = 154
21-
versionName = "2.0.8.1"
20+
versionCode = 155
21+
versionName = "2.0.9"
2222

2323
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2424
vectorDrawables {

app/src/main/java/com/donut/mixfile/util/CommonUtil.kt

Lines changed: 62 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import kotlinx.coroutines.Dispatchers
2727
import kotlinx.coroutines.delay
2828
import kotlinx.coroutines.launch
2929
import java.io.EOFException
30-
import java.math.BigInteger
3130
import java.net.Inet4Address
3231
import java.net.NetworkInterface
3332
import 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

203229
fun <T> List<T>.at(index: Int): T {

0 commit comments

Comments
 (0)