Skip to content

Commit 58f3a76

Browse files
committed
Add ExtensionCode record in KMR.
1 parent 46c1a1d commit 58f3a76

2 files changed

Lines changed: 29 additions & 24 deletions

File tree

src/main/java/com/github/refhumbold/algolib/maths/Fraction.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -254,10 +254,9 @@ public double doubleValue()
254254
@Override
255255
public int compareTo(Number number)
256256
{
257-
if(number instanceof Fraction)
258-
return compare((Fraction)number);
259-
260-
return Double.compare(doubleValue(), number.doubleValue());
257+
return number instanceof Fraction
258+
? compare((Fraction)number)
259+
: Double.compare(doubleValue(), number.doubleValue());
261260
}
262261

263262
private int compare(Fraction f)

src/main/java/com/github/refhumbold/algolib/text/BaseWordsMap.java

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.github.refhumbold.algolib.text;
22

3-
import java.util.Comparator;
43
import java.util.HashMap;
54
import java.util.List;
65
import java.util.Map;
@@ -91,34 +90,35 @@ public Pair<Integer, Integer> getCode(int startIndex, int endIndex)
9190
private void create()
9291
{
9392
int codeValue = extend(1, 0,
94-
(i, length) -> new int[]{ text.charAt(i), 1 + text.charAt(i), i, i + length });
93+
(i, length) -> new ExtensionCode(text.charAt(i), 1 + text.charAt(i), i));
9594

9695
for(int currentLength = 2; currentLength <= text.length(); currentLength *= 2)
9796
codeValue = extend(currentLength, codeValue,
98-
(i, length) -> new int[]{ factors.get(Pair.of(i, i + length / 2)),
99-
factors.get(Pair.of(i + length / 2, i + length)), i, i + length });
97+
(i, length) -> new ExtensionCode(factors.get(Pair.of(i, i + length / 2)),
98+
factors.get(Pair.of(i + length / 2, i + length)), i));
10099
}
101100

102101
// Encodes substring of given length using already counted factors.
103-
private int extend(int length, int codeValue, BiFunction<Integer, Integer, int[]> func)
102+
private int extend(int length, int codeValue, BiFunction<Integer, Integer, ExtensionCode> func)
104103
{
105104
ComparablePair<Integer, Integer> previousCode = ComparablePair.of(0, 0);
106-
List<int[]> codes = IntStream.range(0, text.length() - length + 1)
107-
.mapToObj(i -> func.apply(i, length))
108-
.sorted(new CodesComparator())
109-
.toList();
105+
List<ExtensionCode> codes = IntStream.range(0, text.length() - length + 1)
106+
.mapToObj(i -> func.apply(i, length))
107+
.sorted()
108+
.toList();
110109

111-
for(int[] code : codes)
110+
for(ExtensionCode code : codes)
112111
{
113-
ComparablePair<Integer, Integer> codePair = ComparablePair.of(code[0], code[1]);
112+
ComparablePair<Integer, Integer> codePair =
113+
ComparablePair.of(code.prefixCode, code.suffixCode);
114114

115115
if(!Objects.equals(previousCode, codePair))
116116
{
117117
++codeValue;
118118
previousCode = codePair;
119119
}
120120

121-
factors.put(Pair.of(code[2], code[3]), codeValue);
121+
factors.put(Pair.of(code.index, code.index + length), codeValue);
122122
}
123123

124124
return codeValue;
@@ -138,17 +138,23 @@ private int getMaxLength(int n)
138138
return prev;
139139
}
140140

141-
private static class CodesComparator
142-
implements Comparator<int[]>
141+
private record ExtensionCode(int prefixCode, int suffixCode, int index)
142+
implements Comparable<ExtensionCode>
143143
{
144144
@Override
145-
public int compare(int[] a1, int[] a2)
145+
public int compareTo(ExtensionCode code)
146146
{
147-
return IntStream.range(0, Math.min(a1.length, a2.length))
148-
.map(i -> Integer.compare(a1[i], a2[i]))
149-
.filter(compareInts -> compareInts != 0)
150-
.findFirst()
151-
.orElse(0);
147+
int comparePrefixCodes = Integer.compare(prefixCode, code.prefixCode);
148+
149+
if(comparePrefixCodes != 0)
150+
return comparePrefixCodes;
151+
152+
int compareSuffixCodes = Integer.compare(suffixCode, code.suffixCode);
153+
154+
if(compareSuffixCodes != 0)
155+
return compareSuffixCodes;
156+
157+
return Integer.compare(index, code.index);
152158
}
153159
}
154160
}

0 commit comments

Comments
 (0)