11package com .github .refhumbold .algolib .text ;
22
3- import java .util .Comparator ;
43import java .util .HashMap ;
54import java .util .List ;
65import 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