180180 */
181181public class ColognePhonetic implements StringEncoder {
182182
183- private class CologneLeftBuffer implements CharSequence {
183+ private abstract class CologneBuffer implements CharSequence {
184184
185- private final char [] data ;
186- private int length = 0 ;
185+ protected final char [] data ;
186+ protected int length = 0 ;
187187
188- public CologneLeftBuffer (int buffSize ) {
189- data = new char [buffSize ];
190- }
191-
192- public CologneLeftBuffer (char [] data ) {
188+ public CologneBuffer (char [] data ) {
193189 this .data = data ;
194190 this .length = data .length ;
195191 }
196192
197- public int length ( ) {
198- return length ;
193+ public CologneBuffer ( int buffSize ) {
194+ data = new char [ buffSize ] ;
199195 }
200196
201197 public char charAt (int index ) {
@@ -206,101 +202,81 @@ public char charAt(int index) {
206202 }
207203 }
208204
209- public CharSequence subSequence (int start , int end ) {
210- final int length = end - start ;
211-
212- char [] retData = copyData (start , length );
213-
214- return new CologneLeftBuffer (retData );
215- }
216-
217- private char [] copyData (int start , final int length ) {
218- char [] retData = new char [length ];
219-
220- System .arraycopy (data , start , retData , 0 , length );
221- return retData ;
222- }
205+ protected abstract char [] copyData (int start , final int length );
223206
224- public char getLast () {
225- return data [length - 1 ];
226- }
207+ protected abstract CologneBuffer createCologneBuffer (char [] data );
227208
228- public void putRight (char chr ) {
229- data [length ] = chr ;
230- length ++;
209+ public int length () {
210+ return length ;
231211 }
232212
233- public char dropLast () {
234- length --;
235- return data [length ];
213+ public CharSequence subSequence (int start , int end ) {
214+ final int length = end - start ;
215+ char [] newData = copyData (start , length );
216+ return createCologneBuffer (newData );
236217 }
237218
238219 public String toString () {
239220 return new String (copyData (0 , length ));
240221 }
241222 }
242223
243- private class CologneRightBuffer implements CharSequence {
224+ private class CologneLeftBuffer extends CologneBuffer {
244225
245- private int length = 0 ;
246- private final char [] data ;
226+ public CologneLeftBuffer (char [] data ) {
227+ super (data );
228+ }
247229
248- public CologneRightBuffer (int buffSize ) {
249- data = new char [ buffSize ] ;
230+ public CologneLeftBuffer (int buffSize ) {
231+ super ( buffSize ) ;
250232 }
251233
252- public CologneRightBuffer (char [] data ) {
253- this .data = data ;
254- this .length = data .length ;
234+ protected char [] copyData (int start , final int length ) {
235+ char [] retData = new char [length ];
236+ System .arraycopy (data , start , retData , 0 , length );
237+ return retData ;
255238 }
256239
257- public int length ( ) {
258- return length ;
240+ protected CologneBuffer createCologneBuffer ( char [] data ) {
241+ return new CologneLeftBuffer ( data ) ;
259242 }
260243
261- public char charAt (int index ) {
262- if (index < length ) {
263- return data [data .length - length + index ];
264- } else {
265- throw new IndexOutOfBoundsException ();
266- }
244+ public void putRight (char chr ) {
245+ data [length ] = chr ;
246+ length ++;
267247 }
248+ }
268249
269- public CharSequence subSequence (int start , int end ) {
270- final int length = end - start ;
271- char [] newData = copyData (start , length );
250+ private class CologneRightBuffer extends CologneBuffer {
272251
273- return new CologneRightBuffer (newData );
252+ public CologneRightBuffer (char [] data ) {
253+ super (data );
274254 }
275255
276- private char [] copyData (int start , final int length ) {
256+ protected char [] copyData (int start , final int length ) {
277257 char [] newData = new char [length ];
278-
279- System .arraycopy (data , data .length - this .length + start , newData ,
280- 0 , length );
258+ System .arraycopy (data , data .length - this .length + start , newData , 0 , length );
281259 return newData ;
282260 }
283261
284- public void putLeft (char chr ) {
285- length ++;
286- data [data .length - length ] = chr ;
287- }
288-
289- public char getNext () {
290- return data [data .length - length ];
262+ protected CologneBuffer createCologneBuffer (char [] data ) {
263+ return new CologneRightBuffer (data );
291264 }
292265
293266 public char dropNext () {
294- char ret = data [data .length - length ];
267+ char ch = data [data .length - length ];
295268 length --;
296-
297- return ret ;
269+ return ch ;
298270 }
299271
300- public String toString () {
301- return new String (copyData (0 , length ));
272+ public char getNext () {
273+ return data [data .length - length ];
274+ }
275+
276+ public void putLeft (char ch ) {
277+ length ++;
278+ data [data .length - length ] = ch ;
302279 }
303-
304280 }
305281
306282 private static final char [][] PRE_REPLACEMENTS = new char [][] {
@@ -340,7 +316,6 @@ public String encode(String text) {
340316 * @return the corresponding encoding according to the <i>Kölner
341317 * Phonetik</i> algorithm
342318 */
343-
344319 public String colognePhonetic (String text ) {
345320 if (text == null ) {
346321 return null ;
@@ -430,7 +405,6 @@ public String colognePhonetic(String text) {
430405 lastChar = chr ;
431406 lastCode = code ;
432407 }
433-
434408 return left .toString ();
435409 }
436410
@@ -443,7 +417,6 @@ private static boolean arrayContains(char[] arr, char key) {
443417 return true ;
444418 }
445419 }
446-
447420 return false ;
448421 }
449422
0 commit comments