blob: e6b46a5478f7b5ee78edaea32b622f59e452c296 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
/*
* Copyright © 2017-2023 WireGuard LLC. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.wireguard.android.model
object TunnelComparator : Comparator<String> {
private class NaturalSortString(originalString: String) {
class NaturalSortToken(val maybeString: String?, val maybeNumber: Int?) : Comparable<NaturalSortToken> {
override fun compareTo(other: NaturalSortToken): Int {
if (maybeString == null) {
if (other.maybeString != null || maybeNumber!! < other.maybeNumber!!) {
return -1
} else if (maybeNumber > other.maybeNumber) {
return 1
}
} else if (other.maybeString == null || maybeString > other.maybeString) {
return 1
} else if (maybeString < other.maybeString) {
return -1
}
return 0
}
}
val tokens: MutableList<NaturalSortToken> = ArrayList()
init {
for (s in NATURAL_SORT_DIGIT_FINDER.findAll(originalString.split(WHITESPACE_FINDER).joinToString(" ").lowercase())) {
try {
val n = s.value.toInt()
tokens.add(NaturalSortToken(null, n))
} catch (_: NumberFormatException) {
tokens.add(NaturalSortToken(s.value, null))
}
}
}
private companion object {
private val NATURAL_SORT_DIGIT_FINDER = Regex("""\d+|\D+""")
private val WHITESPACE_FINDER = Regex("""\s""")
}
}
override fun compare(a: String, b: String): Int {
if (a == b)
return 0
val na = NaturalSortString(a)
val nb = NaturalSortString(b)
for (i in 0 until nb.tokens.size) {
if (i == na.tokens.size) {
return -1
}
val c = na.tokens[i].compareTo(nb.tokens[i])
if (c != 0)
return c
}
return 1
}
}
|