TraceLab Component Library
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties
GermanStemmer.cs
Go to the documentation of this file.
1 ÿþ * * P o r t o f S n o w b a l l s t e m m e r s o n C # * O r i g i n a l s t e m m e r s c a n b e f o u n d o n h t t p : / / s n o w b a l l . t a r t a r u s . o r g * L i c e n c e s t i l l B S D : h t t p : / / s n o w b a l l . t a r t a r u s . o r g / l i c e n s e . p h p * * M o s t o f s t e m m e r s a r e p o r t e d f r o m J a v a b y I v e o n i k S y s t e m s l t d . ( w w w . i v e o n i k . c o m ) * * G e r m a n s t e m m e r ' s p o r t f o u n d o n S o u r c e F o r g e s i t e * / u s i n g S y s t e m ; u s i n g S y s t e m . C o l l e c t i o n s . G e n e r i c ; u s i n g S y s t e m . T e x t ; u s i n g S y s t e m . T h r e a d i n g ; n a m e s p a c e T r a c e L a b . C o m p o n e n t s . D e v e l o p m e n t K i t . P r e p r o c e s s o r s . S t e m m e r s . S n o w b a l l . L a n g u a g e s { / / / < s u m m a r y > / / / G e r m a n l a n g u a g e S n o w b a l l i m p l e m e n t a t i o n / / / < / s u m m a r y > p u b l i c c l a s s G e r m a n S t e m m e r : I S n o w b a l l S t e m m e r / / i n t e r n a l c l a s s S t e m m e r G e r m a n { p r i v a t e c h a r [ ] w o r d _ b u f f e r ; p r i v a t e i n t S T R _ S I Z E , R 1 , R 2 ; p r i v a t e i n t B U F F E R _ S I Z E ; p r i v a t e c o n s t i n t I N C = 2 0 ; / / I f o u n d o u t t h i s i s o p t i m a l w o r d s t r i n g s i z e / / / < s u m m a r y > / / / C o n s t r u c t o r / / / < / s u m m a r y > p u b l i c G e r m a n S t e m m e r ( ) { S e t I n i t S t a t e ( ) ; } p r i v a t e v o i d S e t I n i t S t a t e ( ) { R 1 = R 2 = - 1 ; S T R _ S I Z E = 0 ; B U F F E R _ S I Z E = I N C ; w o r d _ b u f f e r = n u l l ; w o r d _ b u f f e r = n e w c h a r [ B U F F E R _ S I Z E ] ; } p r i v a t e v o i d I n c r e m e n t ( ) { c h a r [ ] t m p _ b u f f e r = w o r d _ b u f f e r ; B U F F E R _ S I Z E + = I N C ; w o r d _ b u f f e r = n e w c h a r [ B U F F E R _ S I Z E ] ; t m p _ b u f f e r . C o p y T o ( w o r d _ b u f f e r , 0 ) ; t m p _ b u f f e r = n u l l ; } / / i s c h a r v o w e l / * * T h e f o l l o w i n g l e t t e r s a r e v o w e l s : * a e i o u y ä ö ü * / p r i v a t e b o o l v o w e l ( c h a r c h ) { s w i t c h ( c h ) { c a s e ' a ' : c a s e ' e ' : c a s e ' i ' : c a s e ' o ' : c a s e ' u ' : c a s e ' y ' : c a s e ' ä ' : c a s e ' ö ' : c a s e ' ü ' : r e t u r n t r u e ; d e f a u l t : r e t u r n f a l s e ; } } / / R 1 a n d R 2 s e t u p i n t h e s t a n d a r d w a y p r i v a t e i n t D e f i n e R ( i n t s t a r t ) { i n t l e n = S T R _ S I Z E ; i f ( s t a r t = = 0 ) s t a r t = 1 ; i f ( ( s t a r t < l e n ) & & ( s t a r t > 0 ) ) { f o r ( i n t i = s t a r t ; i < l e n ; + + i ) { i f ( ( ! v o w e l ( w o r d _ b u f f e r [ i ] ) ) & & v o w e l ( w o r d _ b u f f e r [ ( i - 1 ) ] ) ) r e t u r n ( ( i - s t a r t ) + s t a r t + 1 ) ; } } r e t u r n - 1 ; } p r i v a t e v o i d S e t W o r d ( s t r i n g s t r W o r d ) { / / F i r s t , r e p l a c e ß b y s s s t r i n g t m p = s t r W o r d . R e p l a c e ( " ß " , " s s " ) ; / / a d j u s t b u f f e r s i z e w h i l e ( t m p . L e n g t h > B U F F E R _ S I Z E ) I n c r e m e n t ( ) ; S T R _ S I Z E = t m p . L e n g t h ; / / f i l l i n t o b u f f e r t m p . C o p y T o ( 0 , w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } p r i v a t e v o i d C u t E n d ( i n t c o u n t ) { S T R _ S I Z E - = c o u n t ; } p r i v a t e b o o l E n d s W i t h ( s t r i n g e n d ) { i f ( S T R _ S I Z E > e n d . L e n g t h ) { i n t s t o p = S T R _ S I Z E - e n d . L e n g t h - 1 ; i n t j = e n d . L e n g t h - 1 ; f o r ( i n t i = ( S T R _ S I Z E - 1 ) ; i > s t o p ; - - i ) { i f ( w o r d _ b u f f e r [ i ] ! = e n d [ j ] ) r e t u r n f a l s e ; - - j ; } r e t u r n t r u e ; } r e t u r n f a l s e ; } p r i v a t e v o i d p r e p r o c e s s ( ) { / / p u t u a n d y b e t w e e n v o w e l s i n t o u p p e r c a s e f o r ( i n t i = 1 ; i < S T R _ S I Z E ; + + i ) { i f ( w o r d _ b u f f e r [ i ] = = ' u ' ) { i f ( v o w e l ( w o r d _ b u f f e r [ ( i - 1 ) ] ) & & v o w e l ( w o r d _ b u f f e r [ ( i + 1 ) ] ) ) w o r d _ b u f f e r [ i ] = ' U ' ; } e l s e i f ( w o r d _ b u f f e r [ i ] = = ' y ' ) { i f ( v o w e l ( w o r d _ b u f f e r [ ( i - 1 ) ] ) & & v o w e l ( w o r d _ b u f f e r [ ( i + 1 ) ] ) ) w o r d _ b u f f e r [ i ] = ' Y ' ; } } / * * R 1 a n d R 2 a r e f i r s t s e t u p i n t h e s t a n d a r d w a y , * b u t t h e n R 1 i s a d j u s t e d * s o t h a t t h e r e g i o n b e f o r e i t c o n t a i n s a t l e a s t 3 l e t t e r s * / R 1 = D e f i n e R ( 0 ) ; R 2 = D e f i n e R ( R 1 ) ; i f ( ( R 1 < 3 ) & & ( R 1 > - 1 ) ) R 1 = 3 ; } / * * S e a r c h f o r t h e l o n g e s t a m o n g t h e f o l l o w i n g s u f f i x e s , * ( a ) e e m e n e r n e r e s * ( b ) s ( p r e c e d e d b y a v a l i d s - e n d i n g ) * a n d d e l e t e i f i n R 1 . * ( O f c o u r s e t h e l e t t e r o f t h e v a l i d s - e n d i n g i s n o t n e c e s s a r i l y i n R 1 ) * * ( F o r e x a m p l e , ä c k e r n - > ä c k , a c k e r s - > a c k e r , a r m e s - > a r m ) * / p r i v a t e v o i d S t e p 1 ( ) { i f ( R 1 < 0 ) r e t u r n ; / / e e m e n e r n e r e s i f ( E n d s W i t h ( " e r n " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 3 ) C u t E n d ( 3 ) ; } e l s e i f ( E n d s W i t h ( " e m " ) | | E n d s W i t h ( " e n " ) | | E n d s W i t h ( " e r " ) | | E n d s W i t h ( " e s " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 2 ) C u t E n d ( 2 ) ; } e l s e i f ( E n d s W i t h ( " e " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 1 ) C u t E n d ( 1 ) ; } / / b , d , f , g , h , k , l , m , n , r o r t e l s e i f ( E n d s W i t h ( " b s " ) | | E n d s W i t h ( " d s " ) | | E n d s W i t h ( " f s " ) | | E n d s W i t h ( " g s " ) | | E n d s W i t h ( " h s " ) | | E n d s W i t h ( " k s " ) | | E n d s W i t h ( " l s " ) | | E n d s W i t h ( " m s " ) | | E n d s W i t h ( " n s " ) | | E n d s W i t h ( " r s " ) | | E n d s W i t h ( " t s " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 1 ) C u t E n d ( 1 ) ; } } / * * S e a r c h f o r t h e l o n g e s t a m o n g t h e f o l l o w i n g s u f f i x e s , * ( a ) e n e r e s t * ( b ) s t ( p r e c e d e d b y a v a l i d s t - e n d i n g , i t s e l f p r e c e d e d b y a t l e a s t 3 l e t t e r s ) * a n d d e l e t e i f i n R 1 . * * ( F o r e x a m p l e , d e r b s t e n - > d e r b s t b y s t e p 1 , a n d d e r b s t - > d e r b b y s t e p 2 , s i n c e b i s a v a l i d s t - e n d i n g , a n d i s p r e c e d e d b y j u s t 3 l e t t e r s ) * / p r i v a t e v o i d S t e p 2 ( ) { i f ( R 1 < 0 ) r e t u r n ; / / e n e r e s t i f ( E n d s W i t h ( " e s t " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 3 ) C u t E n d ( 3 ) ; } e l s e i f ( E n d s W i t h ( " e n " ) | | E n d s W i t h ( " e r " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 2 ) C u t E n d ( 2 ) ; } / / b , d , f , g , h , k , l , m , n o r t e l s e i f ( E n d s W i t h ( " b s t " ) | | E n d s W i t h ( " d s t " ) | | E n d s W i t h ( " f s t " ) | | E n d s W i t h ( " g s t " ) | | E n d s W i t h ( " h s t " ) | | E n d s W i t h ( " k s t " ) | | E n d s W i t h ( " l s t " ) | | E n d s W i t h ( " m s t " ) | | E n d s W i t h ( " n s t " ) | | E n d s W i t h ( " t s t " ) ) { / / p r e c e d e d b y a t l e a s t 3 l e t t e r s i f ( S T R _ S I Z E > 5 ) { i f ( ( S T R _ S I Z E - R 1 ) > = 2 ) C u t E n d ( 2 ) ; } } } p r i v a t e v o i d S t e p 3 ( ) { i f ( ( R 2 < 0 ) | | ( R 1 < 0 ) ) r e t u r n ; / * * S e a r c h f o r t h e l o n g e s t a m o n g t h e f o l l o w i n g s u f f i x e s , * a n d p e r f o r m t h e a c t i o n i n d i c a t e d . * e n d u n g * d e l e t e i f i n R 2 * i f p r e c e d e d b y i g , d e l e t e i f i n R 2 a n d n o t p r e c e d e d b y e * / i f ( E n d s W i t h ( " e n d " ) | | E n d s W i t h ( " u n g " ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 3 ) C u t E n d ( 3 ) ; i f ( E n d s W i t h ( " i g " ) & & ( w o r d _ b u f f e r [ ( S T R _ S I Z E - 3 ) ] ! = ' e ' ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 2 ) C u t E n d ( 2 ) ; } } / * * i g i k i s c h * d e l e t e i f i n R 2 a n d n o t p r e c e d e d b y e * / e l s e i f ( ( E n d s W i t h ( " i g " ) | | E n d s W i t h ( " i k " ) ) & & ( w o r d _ b u f f e r [ ( S T R _ S I Z E - 3 ) ] ! = ' e ' ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 2 ) C u t E n d ( 2 ) ; } e l s e i f ( E n d s W i t h ( " i s c h " ) & & ( w o r d _ b u f f e r [ ( S T R _ S I Z E - 5 ) ] ! = ' e ' ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 4 ) C u t E n d ( 4 ) ; } / * * l i c h h e i t * d e l e t e i f i n R 2 * i f p r e c e d e d b y e r o r e n , d e l e t e i f i n R 1 * / e l s e i f ( E n d s W i t h ( " l i c h " ) | | E n d s W i t h ( " h e i t " ) ) { C u t E n d ( 4 ) ; / / i f p r e c e d e d b y e r o r e n , d e l e t e i f i n R 1 i f ( E n d s W i t h ( " e n " ) | | E n d s W i t h ( " e r " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 2 ) C u t E n d ( 2 ) ; e l s e S T R _ S I Z E + = 4 ; } e l s e { S T R _ S I Z E + = 4 ; i f ( ( S T R _ S I Z E - R 2 ) > = 4 ) C u t E n d ( 4 ) ; } } / * * k e i t * d e l e t e i f i n R 2 * i f p r e c e d e d b y l i c h o r i g , d e l e t e i f i n R 2 * / e l s e i f ( E n d s W i t h ( " k e i t " ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 4 ) C u t E n d ( 4 ) ; / / i f p r e c e d e d b y l i c h o r i g , d e l e t e i f i n R 2 i f ( E n d s W i t h ( " i g " ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 2 ) C u t E n d ( 2 ) ; } e l s e i f ( E n d s W i t h ( " l i c h " ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 4 ) C u t E n d ( 4 ) ; } } } / / T u r n U a n d Y b a c k i n t o l o w e r c a s e , / / a n d r e m o v e t h e u m l a u t a c c e n t f r o m a , o a n d u . p r i v a t e v o i d F i n a l l y ( ) { f o r ( i n t i = 0 ; i < S T R _ S I Z E ; + + i ) { s w i t c h ( w o r d _ b u f f e r [ i ] ) { c a s e ' ä ' : w o r d _ b u f f e r [ i ] = ' a ' ; b r e a k ; c a s e ' U ' : w o r d _ b u f f e r [ i ] = ' u ' ; b r e a k ; c a s e ' ü ' : w o r d _ b u f f e r [ i ] = ' u ' ; b r e a k ; c a s e ' Y ' : w o r d _ b u f f e r [ i ] = ' y ' ; b r e a k ; c a s e ' ö ' : w o r d _ b u f f e r [ i ] = ' o ' ; b r e a k ; d e f a u l t : b r e a k ; } } } p r i v a t e s t r i n g S t e m ( ) { p r e p r o c e s s ( ) ; S t e p 1 ( ) ; S t e p 2 ( ) ; S t e p 3 ( ) ; F i n a l l y ( ) ; / / r e t u r n s t e m e d w o r d r e t u r n n e w s t r i n g ( w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } i n t c o u n t e r = 0 ; / / / < s u m m a r y > / / / S t e m s t e r m s i n t h e i n p u t s t r i n g / / / < / s u m m a r y > / / / < p a r a m n a m e = " w o r d " > I n p u t s t r i n g < / p a r a m > / / / < r e t u r n s > S t e m m e d t e r m s < / r e t u r n s > p u b l i c s t r i n g S t e m ( s t r i n g w o r d ) { i f ( c o u n t e r > 0 ) t h r o w n e w E x c e p t i o n ( " G e r m a n s t e m m e r i s n o t r e e n t e r a b l e . C r e a t e n e w i n s t a n c e " ) ; I n t e r l o c k e d . I n c r e m e n t ( r e f c o u n t e r ) ; t r y { W o r d = w o r d . T o L o w e r I n v a r i a n t ( ) ; r e t u r n S t e m ( ) ; } f i n a l l y { I n t e r l o c k e d . D e c r e m e n t ( r e f c o u n t e r ) ; } } p r i v a t e s t r i n g W o r d { g e t { r e t u r n n e w s t r i n g ( w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } s e t { S e t I n i t S t a t e ( ) ; S e t W o r d ( v a l u e ) ; } } } } / *
2 
3  * P o r t o f S n o w b a l l s t e m m e r s o n C #
4 
5  * O r i g i n a l s t e m m e r s c a n b e f o u n d o n h t t p : / / s n o w b a l l . t a r t a r u s . o r g
6 
7  * L i c e n c e s t i l l B S D : h t t p : / / s n o w b a l l . t a r t a r u s . o r g / l i c e n s e . p h p
8 
9  *
10 
11  * M o s t o f s t e m m e r s a r e p o r t e d f r o m J a v a b y I v e o n i k S y s t e m s l t d . ( w w w . i v e o n i k . c o m )
12 
13  *
14 
15  * G e r m a n s t e m m e r ' s p o r t f o u n d o n S o u r c e F o r g e s i t e
16 
17  * /
18 
19  u s i n g S y s t e m ;
20 
21  u s i n g S y s t e m . C o l l e c t i o n s . G e n e r i c ;
22 
23  u s i n g S y s t e m . T e x t ;
24 
25  u s i n g S y s t e m . T h r e a d i n g ;
26 
27 
28 
29  n a m e s p a c e T r a c e L a b . C o m p o n e n t s . D e v e l o p m e n t K i t . P r e p r o c e s s o r s . S t e m m e r s . S n o w b a l l . L a n g u a g e s
30 
31  {
32 
33  / / / < s u m m a r y >
34 
35  / / / G e r m a n l a n g u a g e S n o w b a l l i m p l e m e n t a t i o n
36 
37  / / / < / s u m m a r y >
38 
39  p u b l i c c l a s s G e r m a n S t e m m e r : I S n o w b a l l S t e m m e r
40 
41  / / i n t e r n a l c l a s s S t e m m e r G e r m a n
42 
43  {
44 
45 
46 
47  p r i v a t e c h a r [ ] w o r d _ b u f f e r ;
48 
49  p r i v a t e i n t S T R _ S I Z E , R 1 , R 2 ;
50 
51  p r i v a t e i n t B U F F E R _ S I Z E ;
52 
53  p r i v a t e c o n s t i n t I N C = 2 0 ; / / I f o u n d o u t t h i s i s o p t i m a l w o r d s t r i n g s i z e
54 
55 
56 
57  / / / < s u m m a r y >
58 
59  / / / C o n s t r u c t o r
60 
61  / / / < / s u m m a r y >
62 
63  p u b l i c G e r m a n S t e m m e r ( )
64 
65  {
66 
67  S e t I n i t S t a t e ( ) ;
68 
69  }
70 
71 
72 
73  p r i v a t e v o i d S e t I n i t S t a t e ( )
74 
75  {
76 
77  R 1 = R 2 = - 1 ; S T R _ S I Z E = 0 ;
78 
79  B U F F E R _ S I Z E = I N C ;
80 
81  w o r d _ b u f f e r = n u l l ;
82 
83  w o r d _ b u f f e r = n e w c h a r [ B U F F E R _ S I Z E ] ;
84 
85  }
86 
87 
88 
89  p r i v a t e v o i d I n c r e m e n t ( )
90 
91  {
92 
93  c h a r [ ] t m p _ b u f f e r = w o r d _ b u f f e r ;
94 
95  B U F F E R _ S I Z E + = I N C ;
96 
97  w o r d _ b u f f e r = n e w c h a r [ B U F F E R _ S I Z E ] ;
98 
99  t m p _ b u f f e r . C o p y T o ( w o r d _ b u f f e r , 0 ) ;
100 
101  t m p _ b u f f e r = n u l l ;
102 
103  }
104 
105 
106 
107 
108 
109  / / i s c h a r v o w e l
110 
111  / *
112 
113  * T h e f o l l o w i n g l e t t e r s a r e v o w e l s :
114 
115  * a e i o u y ä ö ü
116 
117  * /
118 
119  p r i v a t e b o o l v o w e l ( c h a r c h )
120 
121  {
122 
123  s w i t c h ( c h )
124 
125  {
126 
127  c a s e ' a ' :
128 
129  c a s e ' e ' :
130 
131  c a s e ' i ' :
132 
133  c a s e ' o ' :
134 
135  c a s e ' u ' :
136 
137  c a s e ' y ' :
138 
139  c a s e ' ä' : c a s e ' ö ' : c a s e ' ü ' : r e t u r n t r u e ; d e f a u l t : r e t u r n f a l s e ; } } / / R 1 a n d R 2 s e t u p i n t h e s t a n d a r d w a y p r i v a t e i n t D e f i n e R ( i n t s t a r t ) { i n t l e n = S T R _ S I Z E ; i f ( s t a r t = = 0 ) s t a r t = 1 ; i f ( ( s t a r t < l e n ) & & ( s t a r t > 0 ) ) { f o r ( i n t i = s t a r t ; i < l e n ; + + i ) { i f ( ( ! v o w e l ( w o r d _ b u f f e r [ i ] ) ) & & v o w e l ( w o r d _ b u f f e r [ ( i - 1 ) ] ) ) r e t u r n ( ( i - s t a r t ) + s t a r t + 1 ) ; } } r e t u r n - 1 ; } p r i v a t e v o i d S e t W o r d ( s t r i n g s t r W o r d ) { / / F i r s t , r e p l a c e ß b y s s s t r i n g t m p = s t r W o r d . R e p l a c e ( " ß " , " s s " ) ; / / a d j u s t b u f f e r s i z e w h i l e ( t m p . L e n g t h > B U F F E R _ S I Z E ) I n c r e m e n t ( ) ; S T R _ S I Z E = t m p . L e n g t h ; / / f i l l i n t o b u f f e r t m p . C o p y T o ( 0 , w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } p r i v a t e v o i d C u t E n d ( i n t c o u n t ) { S T R _ S I Z E - = c o u n t ; } p r i v a t e b o o l E n d s W i t h ( s t r i n g e n d ) { i f ( S T R _ S I Z E > e n d . L e n g t h ) { i n t s t o p = S T R _ S I Z E - e n d . L e n g t h - 1 ; i n t j = e n d . L e n g t h - 1 ; f o r ( i n t i = ( S T R _ S I Z E - 1 ) ; i > s t o p ; - - i ) { i f ( w o r d _ b u f f e r [ i ] ! = e n d [ j ] ) r e t u r n f a l s e ; - - j ; } r e t u r n t r u e ; } r e t u r n f a l s e ; } p r i v a t e v o i d p r e p r o c e s s ( ) { / / p u t u a n d y b e t w e e n v o w e l s i n t o u p p e r c a s e f o r ( i n t i = 1 ; i < S T R _ S I Z E ; + + i ) { i f ( w o r d _ b u f f e r [ i ] = = ' u ' ) { i f ( v o w e l ( w o r d _ b u f f e r [ ( i - 1 ) ] ) & & v o w e l ( w o r d _ b u f f e r [ ( i + 1 ) ] ) ) w o r d _ b u f f e r [ i ] = ' U ' ; } e l s e i f ( w o r d _ b u f f e r [ i ] = = ' y ' ) { i f ( v o w e l ( w o r d _ b u f f e r [ ( i - 1 ) ] ) & & v o w e l ( w o r d _ b u f f e r [ ( i + 1 ) ] ) ) w o r d _ b u f f e r [ i ] = ' Y ' ; } } / * * R 1 a n d R 2 a r e f i r s t s e t u p i n t h e s t a n d a r d w a y , * b u t t h e n R 1 i s a d j u s t e d * s o t h a t t h e r e g i o n b e f o r e i t c o n t a i n s a t l e a s t 3 l e t t e r s * / R 1 = D e f i n e R ( 0 ) ; R 2 = D e f i n e R ( R 1 ) ; i f ( ( R 1 < 3 ) & & ( R 1 > - 1 ) ) R 1 = 3 ; } / * * S e a r c h f o r t h e l o n g e s t a m o n g t h e f o l l o w i n g s u f f i x e s , * ( a ) e e m e n e r n e r e s * ( b ) s ( p r e c e d e d b y a v a l i d s - e n d i n g ) * a n d d e l e t e i f i n R 1 . * ( O f c o u r s e t h e l e t t e r o f t h e v a l i d s - e n d i n g i s n o t n e c e s s a r i l y i n R 1 ) * * ( F o r e x a m p l e , ä c k e r n - > ä c k , a c k e r s - > a c k e r , a r m e s - > a r m ) * / p r i v a t e v o i d S t e p 1 ( ) { i f ( R 1 < 0 ) r e t u r n ; / / e e m e n e r n e r e s i f ( E n d s W i t h ( " e r n " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 3 ) C u t E n d ( 3 ) ; } e l s e i f ( E n d s W i t h ( " e m " ) | | E n d s W i t h ( " e n " ) | | E n d s W i t h ( " e r " ) | | E n d s W i t h ( " e s " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 2 ) C u t E n d ( 2 ) ; } e l s e i f ( E n d s W i t h ( " e " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 1 ) C u t E n d ( 1 ) ; } / / b , d , f , g , h , k , l , m , n , r o r t e l s e i f ( E n d s W i t h ( " b s " ) | | E n d s W i t h ( " d s " ) | | E n d s W i t h ( " f s " ) | | E n d s W i t h ( " g s " ) | | E n d s W i t h ( " h s " ) | | E n d s W i t h ( " k s " ) | | E n d s W i t h ( " l s " ) | | E n d s W i t h ( " m s " ) | | E n d s W i t h ( " n s " ) | | E n d s W i t h ( " r s " ) | | E n d s W i t h ( " t s " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 1 ) C u t E n d ( 1 ) ; } } / * * S e a r c h f o r t h e l o n g e s t a m o n g t h e f o l l o w i n g s u f f i x e s , * ( a ) e n e r e s t * ( b ) s t ( p r e c e d e d b y a v a l i d s t - e n d i n g , i t s e l f p r e c e d e d b y a t l e a s t 3 l e t t e r s ) * a n d d e l e t e i f i n R 1 . * * ( F o r e x a m p l e , d e r b s t e n - > d e r b s t b y s t e p 1 , a n d d e r b s t - > d e r b b y s t e p 2 , s i n c e b i s a v a l i d s t - e n d i n g , a n d i s p r e c e d e d b y j u s t 3 l e t t e r s ) * / p r i v a t e v o i d S t e p 2 ( ) { i f ( R 1 < 0 ) r e t u r n ; / / e n e r e s t i f ( E n d s W i t h ( " e s t " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 3 ) C u t E n d ( 3 ) ; } e l s e i f ( E n d s W i t h ( " e n " ) | | E n d s W i t h ( " e r " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 2 ) C u t E n d ( 2 ) ; } / / b , d , f , g , h , k , l , m , n o r t e l s e i f ( E n d s W i t h ( " b s t " ) | | E n d s W i t h ( " d s t " ) | | E n d s W i t h ( " f s t " ) | | E n d s W i t h ( " g s t " ) | | E n d s W i t h ( " h s t " ) | | E n d s W i t h ( " k s t " ) | | E n d s W i t h ( " l s t " ) | | E n d s W i t h ( " m s t " ) | | E n d s W i t h ( " n s t " ) | | E n d s W i t h ( " t s t " ) ) { / / p r e c e d e d b y a t l e a s t 3 l e t t e r s i f ( S T R _ S I Z E > 5 ) { i f ( ( S T R _ S I Z E - R 1 ) > = 2 ) C u t E n d ( 2 ) ; } } } p r i v a t e v o i d S t e p 3 ( ) { i f ( ( R 2 < 0 ) | | ( R 1 < 0 ) ) r e t u r n ; / * * S e a r c h f o r t h e l o n g e s t a m o n g t h e f o l l o w i n g s u f f i x e s , * a n d p e r f o r m t h e a c t i o n i n d i c a t e d . * e n d u n g * d e l e t e i f i n R 2 * i f p r e c e d e d b y i g , d e l e t e i f i n R 2 a n d n o t p r e c e d e d b y e * / i f ( E n d s W i t h ( " e n d " ) | | E n d s W i t h ( " u n g " ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 3 ) C u t E n d ( 3 ) ; i f ( E n d s W i t h ( " i g " ) & & ( w o r d _ b u f f e r [ ( S T R _ S I Z E - 3 ) ] ! = ' e ' ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 2 ) C u t E n d ( 2 ) ; } } / * * i g i k i s c h * d e l e t e i f i n R 2 a n d n o t p r e c e d e d b y e * / e l s e i f ( ( E n d s W i t h ( " i g " ) | | E n d s W i t h ( " i k " ) ) & & ( w o r d _ b u f f e r [ ( S T R _ S I Z E - 3 ) ] ! = ' e ' ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 2 ) C u t E n d ( 2 ) ; } e l s e i f ( E n d s W i t h ( " i s c h " ) & & ( w o r d _ b u f f e r [ ( S T R _ S I Z E - 5 ) ] ! = ' e ' ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 4 ) C u t E n d ( 4 ) ; } / * * l i c h h e i t * d e l e t e i f i n R 2 * i f p r e c e d e d b y e r o r e n , d e l e t e i f i n R 1 * / e l s e i f ( E n d s W i t h ( " l i c h " ) | | E n d s W i t h ( " h e i t " ) ) { C u t E n d ( 4 ) ; / / i f p r e c e d e d b y e r o r e n , d e l e t e i f i n R 1 i f ( E n d s W i t h ( " e n " ) | | E n d s W i t h ( " e r " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 2 ) C u t E n d ( 2 ) ; e l s e S T R _ S I Z E + = 4 ; } e l s e { S T R _ S I Z E + = 4 ; i f ( ( S T R _ S I Z E - R 2 ) > = 4 ) C u t E n d ( 4 ) ; } } / * * k e i t * d e l e t e i f i n R 2 * i f p r e c e d e d b y l i c h o r i g , d e l e t e i f i n R 2 * / e l s e i f ( E n d s W i t h ( " k e i t " ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 4 ) C u t E n d ( 4 ) ; / / i f p r e c e d e d b y l i c h o r i g , d e l e t e i f i n R 2 i f ( E n d s W i t h ( " i g " ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 2 ) C u t E n d ( 2 ) ; } e l s e i f ( E n d s W i t h ( " l i c h " ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 4 ) C u t E n d ( 4 ) ; } } } / / T u r n U a n d Y b a c k i n t o l o w e r c a s e , / / a n d r e m o v e t h e u m l a u t a c c e n t f r o m a , o a n d u . p r i v a t e v o i d F i n a l l y ( ) { f o r ( i n t i = 0 ; i < S T R _ S I Z E ; + + i ) { s w i t c h ( w o r d _ b u f f e r [ i ] ) { c a s e ' ä ' : w o r d _ b u f f e r [ i ] = ' a ' ; b r e a k ; c a s e ' U ' : w o r d _ b u f f e r [ i ] = ' u ' ; b r e a k ; c a s e ' ü ' : w o r d _ b u f f e r [ i ] = ' u ' ; b r e a k ; c a s e ' Y ' : w o r d _ b u f f e r [ i ] = ' y ' ; b r e a k ; c a s e ' ö ' : w o r d _ b u f f e r [ i ] = ' o ' ; b r e a k ; d e f a u l t : b r e a k ; } } } p r i v a t e s t r i n g S t e m ( ) { p r e p r o c e s s ( ) ; S t e p 1 ( ) ; S t e p 2 ( ) ; S t e p 3 ( ) ; F i n a l l y ( ) ; / / r e t u r n s t e m e d w o r d r e t u r n n e w s t r i n g ( w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } i n t c o u n t e r = 0 ; / / / < s u m m a r y > / / / S t e m s t e r m s i n t h e i n p u t s t r i n g / / / < / s u m m a r y > / / / < p a r a m n a m e = " w o r d " > I n p u t s t r i n g < / p a r a m > / / / < r e t u r n s > S t e m m e d t e r m s < / r e t u r n s > p u b l i c s t r i n g S t e m ( s t r i n g w o r d ) { i f ( c o u n t e r > 0 ) t h r o w n e w E x c e p t i o n ( " G e r m a n s t e m m e r i s n o t r e e n t e r a b l e . C r e a t e n e w i n s t a n c e " ) ; I n t e r l o c k e d . I n c r e m e n t ( r e f c o u n t e r ) ; t r y { W o r d = w o r d . T o L o w e r I n v a r i a n t ( ) ; r e t u r n S t e m ( ) ; } f i n a l l y { I n t e r l o c k e d . D e c r e m e n t ( r e f c o u n t e r ) ; } } p r i v a t e s t r i n g W o r d { g e t { r e t u r n n e w s t r i n g ( w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } s e t { S e t I n i t S t a t e ( ) ; S e t W o r d ( v a l u e ) ; } } } } ' :
140 
141  c a s e ' ö' : c a s e ' ü ' : r e t u r n t r u e ; d e f a u l t : r e t u r n f a l s e ; } } / / R 1 a n d R 2 s e t u p i n t h e s t a n d a r d w a y p r i v a t e i n t D e f i n e R ( i n t s t a r t ) { i n t l e n = S T R _ S I Z E ; i f ( s t a r t = = 0 ) s t a r t = 1 ; i f ( ( s t a r t < l e n ) & & ( s t a r t > 0 ) ) { f o r ( i n t i = s t a r t ; i < l e n ; + + i ) { i f ( ( ! v o w e l ( w o r d _ b u f f e r [ i ] ) ) & & v o w e l ( w o r d _ b u f f e r [ ( i - 1 ) ] ) ) r e t u r n ( ( i - s t a r t ) + s t a r t + 1 ) ; } } r e t u r n - 1 ; } p r i v a t e v o i d S e t W o r d ( s t r i n g s t r W o r d ) { / / F i r s t , r e p l a c e ß b y s s s t r i n g t m p = s t r W o r d . R e p l a c e ( " ß " , " s s " ) ; / / a d j u s t b u f f e r s i z e w h i l e ( t m p . L e n g t h > B U F F E R _ S I Z E ) I n c r e m e n t ( ) ; S T R _ S I Z E = t m p . L e n g t h ; / / f i l l i n t o b u f f e r t m p . C o p y T o ( 0 , w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } p r i v a t e v o i d C u t E n d ( i n t c o u n t ) { S T R _ S I Z E - = c o u n t ; } p r i v a t e b o o l E n d s W i t h ( s t r i n g e n d ) { i f ( S T R _ S I Z E > e n d . L e n g t h ) { i n t s t o p = S T R _ S I Z E - e n d . L e n g t h - 1 ; i n t j = e n d . L e n g t h - 1 ; f o r ( i n t i = ( S T R _ S I Z E - 1 ) ; i > s t o p ; - - i ) { i f ( w o r d _ b u f f e r [ i ] ! = e n d [ j ] ) r e t u r n f a l s e ; - - j ; } r e t u r n t r u e ; } r e t u r n f a l s e ; } p r i v a t e v o i d p r e p r o c e s s ( ) { / / p u t u a n d y b e t w e e n v o w e l s i n t o u p p e r c a s e f o r ( i n t i = 1 ; i < S T R _ S I Z E ; + + i ) { i f ( w o r d _ b u f f e r [ i ] = = ' u ' ) { i f ( v o w e l ( w o r d _ b u f f e r [ ( i - 1 ) ] ) & & v o w e l ( w o r d _ b u f f e r [ ( i + 1 ) ] ) ) w o r d _ b u f f e r [ i ] = ' U ' ; } e l s e i f ( w o r d _ b u f f e r [ i ] = = ' y ' ) { i f ( v o w e l ( w o r d _ b u f f e r [ ( i - 1 ) ] ) & & v o w e l ( w o r d _ b u f f e r [ ( i + 1 ) ] ) ) w o r d _ b u f f e r [ i ] = ' Y ' ; } } / * * R 1 a n d R 2 a r e f i r s t s e t u p i n t h e s t a n d a r d w a y , * b u t t h e n R 1 i s a d j u s t e d * s o t h a t t h e r e g i o n b e f o r e i t c o n t a i n s a t l e a s t 3 l e t t e r s * / R 1 = D e f i n e R ( 0 ) ; R 2 = D e f i n e R ( R 1 ) ; i f ( ( R 1 < 3 ) & & ( R 1 > - 1 ) ) R 1 = 3 ; } / * * S e a r c h f o r t h e l o n g e s t a m o n g t h e f o l l o w i n g s u f f i x e s , * ( a ) e e m e n e r n e r e s * ( b ) s ( p r e c e d e d b y a v a l i d s - e n d i n g ) * a n d d e l e t e i f i n R 1 . * ( O f c o u r s e t h e l e t t e r o f t h e v a l i d s - e n d i n g i s n o t n e c e s s a r i l y i n R 1 ) * * ( F o r e x a m p l e , ä c k e r n - > ä c k , a c k e r s - > a c k e r , a r m e s - > a r m ) * / p r i v a t e v o i d S t e p 1 ( ) { i f ( R 1 < 0 ) r e t u r n ; / / e e m e n e r n e r e s i f ( E n d s W i t h ( " e r n " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 3 ) C u t E n d ( 3 ) ; } e l s e i f ( E n d s W i t h ( " e m " ) | | E n d s W i t h ( " e n " ) | | E n d s W i t h ( " e r " ) | | E n d s W i t h ( " e s " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 2 ) C u t E n d ( 2 ) ; } e l s e i f ( E n d s W i t h ( " e " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 1 ) C u t E n d ( 1 ) ; } / / b , d , f , g , h , k , l , m , n , r o r t e l s e i f ( E n d s W i t h ( " b s " ) | | E n d s W i t h ( " d s " ) | | E n d s W i t h ( " f s " ) | | E n d s W i t h ( " g s " ) | | E n d s W i t h ( " h s " ) | | E n d s W i t h ( " k s " ) | | E n d s W i t h ( " l s " ) | | E n d s W i t h ( " m s " ) | | E n d s W i t h ( " n s " ) | | E n d s W i t h ( " r s " ) | | E n d s W i t h ( " t s " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 1 ) C u t E n d ( 1 ) ; } } / * * S e a r c h f o r t h e l o n g e s t a m o n g t h e f o l l o w i n g s u f f i x e s , * ( a ) e n e r e s t * ( b ) s t ( p r e c e d e d b y a v a l i d s t - e n d i n g , i t s e l f p r e c e d e d b y a t l e a s t 3 l e t t e r s ) * a n d d e l e t e i f i n R 1 . * * ( F o r e x a m p l e , d e r b s t e n - > d e r b s t b y s t e p 1 , a n d d e r b s t - > d e r b b y s t e p 2 , s i n c e b i s a v a l i d s t - e n d i n g , a n d i s p r e c e d e d b y j u s t 3 l e t t e r s ) * / p r i v a t e v o i d S t e p 2 ( ) { i f ( R 1 < 0 ) r e t u r n ; / / e n e r e s t i f ( E n d s W i t h ( " e s t " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 3 ) C u t E n d ( 3 ) ; } e l s e i f ( E n d s W i t h ( " e n " ) | | E n d s W i t h ( " e r " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 2 ) C u t E n d ( 2 ) ; } / / b , d , f , g , h , k , l , m , n o r t e l s e i f ( E n d s W i t h ( " b s t " ) | | E n d s W i t h ( " d s t " ) | | E n d s W i t h ( " f s t " ) | | E n d s W i t h ( " g s t " ) | | E n d s W i t h ( " h s t " ) | | E n d s W i t h ( " k s t " ) | | E n d s W i t h ( " l s t " ) | | E n d s W i t h ( " m s t " ) | | E n d s W i t h ( " n s t " ) | | E n d s W i t h ( " t s t " ) ) { / / p r e c e d e d b y a t l e a s t 3 l e t t e r s i f ( S T R _ S I Z E > 5 ) { i f ( ( S T R _ S I Z E - R 1 ) > = 2 ) C u t E n d ( 2 ) ; } } } p r i v a t e v o i d S t e p 3 ( ) { i f ( ( R 2 < 0 ) | | ( R 1 < 0 ) ) r e t u r n ; / * * S e a r c h f o r t h e l o n g e s t a m o n g t h e f o l l o w i n g s u f f i x e s , * a n d p e r f o r m t h e a c t i o n i n d i c a t e d . * e n d u n g * d e l e t e i f i n R 2 * i f p r e c e d e d b y i g , d e l e t e i f i n R 2 a n d n o t p r e c e d e d b y e * / i f ( E n d s W i t h ( " e n d " ) | | E n d s W i t h ( " u n g " ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 3 ) C u t E n d ( 3 ) ; i f ( E n d s W i t h ( " i g " ) & & ( w o r d _ b u f f e r [ ( S T R _ S I Z E - 3 ) ] ! = ' e ' ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 2 ) C u t E n d ( 2 ) ; } } / * * i g i k i s c h * d e l e t e i f i n R 2 a n d n o t p r e c e d e d b y e * / e l s e i f ( ( E n d s W i t h ( " i g " ) | | E n d s W i t h ( " i k " ) ) & & ( w o r d _ b u f f e r [ ( S T R _ S I Z E - 3 ) ] ! = ' e ' ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 2 ) C u t E n d ( 2 ) ; } e l s e i f ( E n d s W i t h ( " i s c h " ) & & ( w o r d _ b u f f e r [ ( S T R _ S I Z E - 5 ) ] ! = ' e ' ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 4 ) C u t E n d ( 4 ) ; } / * * l i c h h e i t * d e l e t e i f i n R 2 * i f p r e c e d e d b y e r o r e n , d e l e t e i f i n R 1 * / e l s e i f ( E n d s W i t h ( " l i c h " ) | | E n d s W i t h ( " h e i t " ) ) { C u t E n d ( 4 ) ; / / i f p r e c e d e d b y e r o r e n , d e l e t e i f i n R 1 i f ( E n d s W i t h ( " e n " ) | | E n d s W i t h ( " e r " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 2 ) C u t E n d ( 2 ) ; e l s e S T R _ S I Z E + = 4 ; } e l s e { S T R _ S I Z E + = 4 ; i f ( ( S T R _ S I Z E - R 2 ) > = 4 ) C u t E n d ( 4 ) ; } } / * * k e i t * d e l e t e i f i n R 2 * i f p r e c e d e d b y l i c h o r i g , d e l e t e i f i n R 2 * / e l s e i f ( E n d s W i t h ( " k e i t " ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 4 ) C u t E n d ( 4 ) ; / / i f p r e c e d e d b y l i c h o r i g , d e l e t e i f i n R 2 i f ( E n d s W i t h ( " i g " ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 2 ) C u t E n d ( 2 ) ; } e l s e i f ( E n d s W i t h ( " l i c h " ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 4 ) C u t E n d ( 4 ) ; } } } / / T u r n U a n d Y b a c k i n t o l o w e r c a s e , / / a n d r e m o v e t h e u m l a u t a c c e n t f r o m a , o a n d u . p r i v a t e v o i d F i n a l l y ( ) { f o r ( i n t i = 0 ; i < S T R _ S I Z E ; + + i ) { s w i t c h ( w o r d _ b u f f e r [ i ] ) { c a s e ' ä ' : w o r d _ b u f f e r [ i ] = ' a ' ; b r e a k ; c a s e ' U ' : w o r d _ b u f f e r [ i ] = ' u ' ; b r e a k ; c a s e ' ü ' : w o r d _ b u f f e r [ i ] = ' u ' ; b r e a k ; c a s e ' Y ' : w o r d _ b u f f e r [ i ] = ' y ' ; b r e a k ; c a s e ' ö ' : w o r d _ b u f f e r [ i ] = ' o ' ; b r e a k ; d e f a u l t : b r e a k ; } } } p r i v a t e s t r i n g S t e m ( ) { p r e p r o c e s s ( ) ; S t e p 1 ( ) ; S t e p 2 ( ) ; S t e p 3 ( ) ; F i n a l l y ( ) ; / / r e t u r n s t e m e d w o r d r e t u r n n e w s t r i n g ( w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } i n t c o u n t e r = 0 ; / / / < s u m m a r y > / / / S t e m s t e r m s i n t h e i n p u t s t r i n g / / / < / s u m m a r y > / / / < p a r a m n a m e = " w o r d " > I n p u t s t r i n g < / p a r a m > / / / < r e t u r n s > S t e m m e d t e r m s < / r e t u r n s > p u b l i c s t r i n g S t e m ( s t r i n g w o r d ) { i f ( c o u n t e r > 0 ) t h r o w n e w E x c e p t i o n ( " G e r m a n s t e m m e r i s n o t r e e n t e r a b l e . C r e a t e n e w i n s t a n c e " ) ; I n t e r l o c k e d . I n c r e m e n t ( r e f c o u n t e r ) ; t r y { W o r d = w o r d . T o L o w e r I n v a r i a n t ( ) ; r e t u r n S t e m ( ) ; } f i n a l l y { I n t e r l o c k e d . D e c r e m e n t ( r e f c o u n t e r ) ; } } p r i v a t e s t r i n g W o r d { g e t { r e t u r n n e w s t r i n g ( w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } s e t { S e t I n i t S t a t e ( ) ; S e t W o r d ( v a l u e ) ; } } } } ' :
142 
143  c a s e ' ü' : r e t u r n t r u e ; d e f a u l t : r e t u r n f a l s e ; } } / / R 1 a n d R 2 s e t u p i n t h e s t a n d a r d w a y p r i v a t e i n t D e f i n e R ( i n t s t a r t ) { i n t l e n = S T R _ S I Z E ; i f ( s t a r t = = 0 ) s t a r t = 1 ; i f ( ( s t a r t < l e n ) & & ( s t a r t > 0 ) ) { f o r ( i n t i = s t a r t ; i < l e n ; + + i ) { i f ( ( ! v o w e l ( w o r d _ b u f f e r [ i ] ) ) & & v o w e l ( w o r d _ b u f f e r [ ( i - 1 ) ] ) ) r e t u r n ( ( i - s t a r t ) + s t a r t + 1 ) ; } } r e t u r n - 1 ; } p r i v a t e v o i d S e t W o r d ( s t r i n g s t r W o r d ) { / / F i r s t , r e p l a c e ß b y s s s t r i n g t m p = s t r W o r d . R e p l a c e ( " ß " , " s s " ) ; / / a d j u s t b u f f e r s i z e w h i l e ( t m p . L e n g t h > B U F F E R _ S I Z E ) I n c r e m e n t ( ) ; S T R _ S I Z E = t m p . L e n g t h ; / / f i l l i n t o b u f f e r t m p . C o p y T o ( 0 , w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } p r i v a t e v o i d C u t E n d ( i n t c o u n t ) { S T R _ S I Z E - = c o u n t ; } p r i v a t e b o o l E n d s W i t h ( s t r i n g e n d ) { i f ( S T R _ S I Z E > e n d . L e n g t h ) { i n t s t o p = S T R _ S I Z E - e n d . L e n g t h - 1 ; i n t j = e n d . L e n g t h - 1 ; f o r ( i n t i = ( S T R _ S I Z E - 1 ) ; i > s t o p ; - - i ) { i f ( w o r d _ b u f f e r [ i ] ! = e n d [ j ] ) r e t u r n f a l s e ; - - j ; } r e t u r n t r u e ; } r e t u r n f a l s e ; } p r i v a t e v o i d p r e p r o c e s s ( ) { / / p u t u a n d y b e t w e e n v o w e l s i n t o u p p e r c a s e f o r ( i n t i = 1 ; i < S T R _ S I Z E ; + + i ) { i f ( w o r d _ b u f f e r [ i ] = = ' u ' ) { i f ( v o w e l ( w o r d _ b u f f e r [ ( i - 1 ) ] ) & & v o w e l ( w o r d _ b u f f e r [ ( i + 1 ) ] ) ) w o r d _ b u f f e r [ i ] = ' U ' ; } e l s e i f ( w o r d _ b u f f e r [ i ] = = ' y ' ) { i f ( v o w e l ( w o r d _ b u f f e r [ ( i - 1 ) ] ) & & v o w e l ( w o r d _ b u f f e r [ ( i + 1 ) ] ) ) w o r d _ b u f f e r [ i ] = ' Y ' ; } } / * * R 1 a n d R 2 a r e f i r s t s e t u p i n t h e s t a n d a r d w a y , * b u t t h e n R 1 i s a d j u s t e d * s o t h a t t h e r e g i o n b e f o r e i t c o n t a i n s a t l e a s t 3 l e t t e r s * / R 1 = D e f i n e R ( 0 ) ; R 2 = D e f i n e R ( R 1 ) ; i f ( ( R 1 < 3 ) & & ( R 1 > - 1 ) ) R 1 = 3 ; } / * * S e a r c h f o r t h e l o n g e s t a m o n g t h e f o l l o w i n g s u f f i x e s , * ( a ) e e m e n e r n e r e s * ( b ) s ( p r e c e d e d b y a v a l i d s - e n d i n g ) * a n d d e l e t e i f i n R 1 . * ( O f c o u r s e t h e l e t t e r o f t h e v a l i d s - e n d i n g i s n o t n e c e s s a r i l y i n R 1 ) * * ( F o r e x a m p l e , ä c k e r n - > ä c k , a c k e r s - > a c k e r , a r m e s - > a r m ) * / p r i v a t e v o i d S t e p 1 ( ) { i f ( R 1 < 0 ) r e t u r n ; / / e e m e n e r n e r e s i f ( E n d s W i t h ( " e r n " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 3 ) C u t E n d ( 3 ) ; } e l s e i f ( E n d s W i t h ( " e m " ) | | E n d s W i t h ( " e n " ) | | E n d s W i t h ( " e r " ) | | E n d s W i t h ( " e s " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 2 ) C u t E n d ( 2 ) ; } e l s e i f ( E n d s W i t h ( " e " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 1 ) C u t E n d ( 1 ) ; } / / b , d , f , g , h , k , l , m , n , r o r t e l s e i f ( E n d s W i t h ( " b s " ) | | E n d s W i t h ( " d s " ) | | E n d s W i t h ( " f s " ) | | E n d s W i t h ( " g s " ) | | E n d s W i t h ( " h s " ) | | E n d s W i t h ( " k s " ) | | E n d s W i t h ( " l s " ) | | E n d s W i t h ( " m s " ) | | E n d s W i t h ( " n s " ) | | E n d s W i t h ( " r s " ) | | E n d s W i t h ( " t s " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 1 ) C u t E n d ( 1 ) ; } } / * * S e a r c h f o r t h e l o n g e s t a m o n g t h e f o l l o w i n g s u f f i x e s , * ( a ) e n e r e s t * ( b ) s t ( p r e c e d e d b y a v a l i d s t - e n d i n g , i t s e l f p r e c e d e d b y a t l e a s t 3 l e t t e r s ) * a n d d e l e t e i f i n R 1 . * * ( F o r e x a m p l e , d e r b s t e n - > d e r b s t b y s t e p 1 , a n d d e r b s t - > d e r b b y s t e p 2 , s i n c e b i s a v a l i d s t - e n d i n g , a n d i s p r e c e d e d b y j u s t 3 l e t t e r s ) * / p r i v a t e v o i d S t e p 2 ( ) { i f ( R 1 < 0 ) r e t u r n ; / / e n e r e s t i f ( E n d s W i t h ( " e s t " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 3 ) C u t E n d ( 3 ) ; } e l s e i f ( E n d s W i t h ( " e n " ) | | E n d s W i t h ( " e r " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 2 ) C u t E n d ( 2 ) ; } / / b , d , f , g , h , k , l , m , n o r t e l s e i f ( E n d s W i t h ( " b s t " ) | | E n d s W i t h ( " d s t " ) | | E n d s W i t h ( " f s t " ) | | E n d s W i t h ( " g s t " ) | | E n d s W i t h ( " h s t " ) | | E n d s W i t h ( " k s t " ) | | E n d s W i t h ( " l s t " ) | | E n d s W i t h ( " m s t " ) | | E n d s W i t h ( " n s t " ) | | E n d s W i t h ( " t s t " ) ) { / / p r e c e d e d b y a t l e a s t 3 l e t t e r s i f ( S T R _ S I Z E > 5 ) { i f ( ( S T R _ S I Z E - R 1 ) > = 2 ) C u t E n d ( 2 ) ; } } } p r i v a t e v o i d S t e p 3 ( ) { i f ( ( R 2 < 0 ) | | ( R 1 < 0 ) ) r e t u r n ; / * * S e a r c h f o r t h e l o n g e s t a m o n g t h e f o l l o w i n g s u f f i x e s , * a n d p e r f o r m t h e a c t i o n i n d i c a t e d . * e n d u n g * d e l e t e i f i n R 2 * i f p r e c e d e d b y i g , d e l e t e i f i n R 2 a n d n o t p r e c e d e d b y e * / i f ( E n d s W i t h ( " e n d " ) | | E n d s W i t h ( " u n g " ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 3 ) C u t E n d ( 3 ) ; i f ( E n d s W i t h ( " i g " ) & & ( w o r d _ b u f f e r [ ( S T R _ S I Z E - 3 ) ] ! = ' e ' ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 2 ) C u t E n d ( 2 ) ; } } / * * i g i k i s c h * d e l e t e i f i n R 2 a n d n o t p r e c e d e d b y e * / e l s e i f ( ( E n d s W i t h ( " i g " ) | | E n d s W i t h ( " i k " ) ) & & ( w o r d _ b u f f e r [ ( S T R _ S I Z E - 3 ) ] ! = ' e ' ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 2 ) C u t E n d ( 2 ) ; } e l s e i f ( E n d s W i t h ( " i s c h " ) & & ( w o r d _ b u f f e r [ ( S T R _ S I Z E - 5 ) ] ! = ' e ' ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 4 ) C u t E n d ( 4 ) ; } / * * l i c h h e i t * d e l e t e i f i n R 2 * i f p r e c e d e d b y e r o r e n , d e l e t e i f i n R 1 * / e l s e i f ( E n d s W i t h ( " l i c h " ) | | E n d s W i t h ( " h e i t " ) ) { C u t E n d ( 4 ) ; / / i f p r e c e d e d b y e r o r e n , d e l e t e i f i n R 1 i f ( E n d s W i t h ( " e n " ) | | E n d s W i t h ( " e r " ) ) { i f ( ( S T R _ S I Z E - R 1 ) > = 2 ) C u t E n d ( 2 ) ; e l s e S T R _ S I Z E + = 4 ; } e l s e { S T R _ S I Z E + = 4 ; i f ( ( S T R _ S I Z E - R 2 ) > = 4 ) C u t E n d ( 4 ) ; } } / * * k e i t * d e l e t e i f i n R 2 * i f p r e c e d e d b y l i c h o r i g , d e l e t e i f i n R 2 * / e l s e i f ( E n d s W i t h ( " k e i t " ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 4 ) C u t E n d ( 4 ) ; / / i f p r e c e d e d b y l i c h o r i g , d e l e t e i f i n R 2 i f ( E n d s W i t h ( " i g " ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 2 ) C u t E n d ( 2 ) ; } e l s e i f ( E n d s W i t h ( " l i c h " ) ) { i f ( ( S T R _ S I Z E - R 2 ) > = 4 ) C u t E n d ( 4 ) ; } } } / / T u r n U a n d Y b a c k i n t o l o w e r c a s e , / / a n d r e m o v e t h e u m l a u t a c c e n t f r o m a , o a n d u . p r i v a t e v o i d F i n a l l y ( ) { f o r ( i n t i = 0 ; i < S T R _ S I Z E ; + + i ) { s w i t c h ( w o r d _ b u f f e r [ i ] ) { c a s e ' ä ' : w o r d _ b u f f e r [ i ] = ' a ' ; b r e a k ; c a s e ' U ' : w o r d _ b u f f e r [ i ] = ' u ' ; b r e a k ; c a s e ' ü ' : w o r d _ b u f f e r [ i ] = ' u ' ; b r e a k ; c a s e ' Y ' : w o r d _ b u f f e r [ i ] = ' y ' ; b r e a k ; c a s e ' ö ' : w o r d _ b u f f e r [ i ] = ' o ' ; b r e a k ; d e f a u l t : b r e a k ; } } } p r i v a t e s t r i n g S t e m ( ) { p r e p r o c e s s ( ) ; S t e p 1 ( ) ; S t e p 2 ( ) ; S t e p 3 ( ) ; F i n a l l y ( ) ; / / r e t u r n s t e m e d w o r d r e t u r n n e w s t r i n g ( w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } i n t c o u n t e r = 0 ; / / / < s u m m a r y > / / / S t e m s t e r m s i n t h e i n p u t s t r i n g / / / < / s u m m a r y > / / / < p a r a m n a m e = " w o r d " > I n p u t s t r i n g < / p a r a m > / / / < r e t u r n s > S t e m m e d t e r m s < / r e t u r n s > p u b l i c s t r i n g S t e m ( s t r i n g w o r d ) { i f ( c o u n t e r > 0 ) t h r o w n e w E x c e p t i o n ( " G e r m a n s t e m m e r i s n o t r e e n t e r a b l e . C r e a t e n e w i n s t a n c e " ) ; I n t e r l o c k e d . I n c r e m e n t ( r e f c o u n t e r ) ; t r y { W o r d = w o r d . T o L o w e r I n v a r i a n t ( ) ; r e t u r n S t e m ( ) ; } f i n a l l y { I n t e r l o c k e d . D e c r e m e n t ( r e f c o u n t e r ) ; } } p r i v a t e s t r i n g W o r d { g e t { r e t u r n n e w s t r i n g ( w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } s e t { S e t I n i t S t a t e ( ) ; S e t W o r d ( v a l u e ) ; } } } } ' : r e t u r n t r u e ;
144 
145  d e f a u l t : r e t u r n f a l s e ;
146 
147  }
148 
149  }
150 
151 
152 
153  / / R 1 a n d R 2 s e t u p i n t h e s t a n d a r d w a y
154 
155  p r i v a t e i n t D e f i n e R ( i n t s t a r t )
156 
157  {
158 
159  i n t l e n = S T R _ S I Z E ;
160 
161  i f ( s t a r t = = 0 )
162 
163  s t a r t = 1 ;
164 
165 
166 
167  i f ( ( s t a r t < l e n ) & & ( s t a r t > 0 ) )
168 
169  {
170 
171  f o r ( i n t i = s t a r t ; i < l e n ; + + i )
172 
173  {
174 
175  i f ( ( ! v o w e l ( w o r d _ b u f f e r [ i ] ) ) & & v o w e l ( w o r d _ b u f f e r [ ( i - 1 ) ] ) )
176 
177  r e t u r n ( ( i - s t a r t ) + s t a r t + 1 ) ;
178 
179  }
180 
181  }
182 
183  r e t u r n - 1 ;
184 
185  }
186 
187 
188 
189  p r i v a t e v o i d S e t W o r d ( s t r i n g s t r W o r d )
190 
191  {
192 
193  / / F i r s t , r e p l a c e ß b y s s
194 
195  s t r i n g t m p = s t r W o r d . R e p l a c e ( " ß " , " s s " ) ;
196 
197  / / a d j u s t b u f f e r s i z e
198 
199  w h i l e ( t m p . L e n g t h > B U F F E R _ S I Z E )
200 
201  I n c r e m e n t ( ) ;
202 
203  S T R _ S I Z E = t m p . L e n g t h ;
204 
205  / / f i l l i n t o b u f f e r
206 
207  t m p . C o p y T o ( 0 , w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ;
208 
209  }
210 
211 
212 
213  p r i v a t e v o i d C u t E n d ( i n t c o u n t ) { S T R _ S I Z E - = c o u n t ; }
214 
215 
216 
217  p r i v a t e b o o l E n d s W i t h ( s t r i n g e n d )
218 
219  {
220 
221  i f ( S T R _ S I Z E > e n d . L e n g t h )
222 
223  {
224 
225  i n t s t o p = S T R _ S I Z E - e n d . L e n g t h - 1 ;
226 
227  i n t j = e n d . L e n g t h - 1 ;
228 
229  f o r ( i n t i = ( S T R _ S I Z E - 1 ) ; i > s t o p ; - - i )
230 
231  {
232 
233  i f ( w o r d _ b u f f e r [ i ] ! = e n d [ j ] )
234 
235  r e t u r n f a l s e ;
236 
237  - - j ;
238 
239  }
240 
241  r e t u r n t r u e ;
242 
243  }
244 
245  r e t u r n f a l s e ;
246 
247  }
248 
249 
250 
251  p r i v a t e v o i d p r e p r o c e s s ( )
252 
253  {
254 
255  / / p u t u a n d y b e t w e e n v o w e l s i n t o u p p e r c a s e
256 
257  f o r ( i n t i = 1 ; i < S T R _ S I Z E ; + + i )
258 
259  {
260 
261  i f ( w o r d _ b u f f e r [ i ] = = ' u ' )
262 
263  {
264 
265  i f ( v o w e l ( w o r d _ b u f f e r [ ( i - 1 ) ] ) & & v o w e l ( w o r d _ b u f f e r [ ( i + 1 ) ] ) )
266 
267  w o r d _ b u f f e r [ i ] = ' U ' ;
268 
269  }
270 
271  e l s e i f ( w o r d _ b u f f e r [ i ] = = ' y ' )
272 
273  {
274 
275  i f ( v o w e l ( w o r d _ b u f f e r [ ( i - 1 ) ] ) & & v o w e l ( w o r d _ b u f f e r [ ( i + 1 ) ] ) )
276 
277  w o r d _ b u f f e r [ i ] = ' Y ' ;
278 
279  }
280 
281  }
282 
283  / *
284 
285  * R 1 a n d R 2 a r e f i r s t s e t u p i n t h e s t a n d a r d w a y ,
286 
287  * b u t t h e n R 1 i s a d j u s t e d
288 
289  * s o t h a t t h e r e g i o n b e f o r e i t c o n t a i n s a t l e a s t 3 l e t t e r s
290 
291  * /
292 
293  R 1 = D e f i n e R ( 0 ) ;
294 
295  R 2 = D e f i n e R ( R 1 ) ;
296 
297  i f ( ( R 1 < 3 ) & & ( R 1 > - 1 ) )
298 
299  R 1 = 3 ;
300 
301  }
302 
303 
304 
305  / *
306 
307  * S e a r c h f o r t h e l o n g e s t a m o n g t h e f o l l o w i n g s u f f i x e s ,
308 
309  * ( a ) e e m e n e r n e r e s
310 
311  * ( b ) s ( p r e c e d e d b y a v a l i d s - e n d i n g )
312 
313  * a n d d e l e t e i f i n R 1 .
314 
315  * ( O f c o u r s e t h e l e t t e r o f t h e v a l i d s - e n d i n g i s n o t n e c e s s a r i l y i n R 1 )
316 
317  *
318 
319  * ( F o r e x a m p l e , ä c k e r n - > ä c k , a c k e r s - > a c k e r , a r m e s - > a r m )
320 
321  * /
322 
323  p r i v a t e v o i d S t e p 1 ( )
324 
325  {
326 
327  i f ( R 1 < 0 )
328 
329  r e t u r n ;
330 
331  / / e e m e n e r n e r e s
332 
333  i f ( E n d s W i t h ( " e r n " ) )
334 
335  {
336 
337  i f ( ( S T R _ S I Z E - R 1 ) > = 3 )
338 
339  C u t E n d ( 3 ) ;
340 
341  }
342 
343  e l s e i f ( E n d s W i t h ( " e m " ) | | E n d s W i t h ( " e n " ) | | E n d s W i t h ( " e r " ) | | E n d s W i t h ( " e s " ) )
344 
345  {
346 
347  i f ( ( S T R _ S I Z E - R 1 ) > = 2 )
348 
349  C u t E n d ( 2 ) ;
350 
351  }
352 
353  e l s e i f ( E n d s W i t h ( " e " ) )
354 
355  {
356 
357  i f ( ( S T R _ S I Z E - R 1 ) > = 1 )
358 
359  C u t E n d ( 1 ) ;
360 
361  }
362 
363  / / b , d , f , g , h , k , l , m , n , r o r t
364 
365  e l s e i f ( E n d s W i t h ( " b s " ) | | E n d s W i t h ( " d s " ) | | E n d s W i t h ( " f s " ) | |
366 
367  E n d s W i t h ( " g s " ) | | E n d s W i t h ( " h s " ) | | E n d s W i t h ( " k s " ) | |
368 
369  E n d s W i t h ( " l s " ) | | E n d s W i t h ( " m s " ) | | E n d s W i t h ( " n s " ) | |
370 
371  E n d s W i t h ( " r s " ) | | E n d s W i t h ( " t s " ) )
372 
373  {
374 
375  i f ( ( S T R _ S I Z E - R 1 ) > = 1 )
376 
377  C u t E n d ( 1 ) ;
378 
379  }
380 
381  }
382 
383 
384 
385  / *
386 
387  * S e a r c h f o r t h e l o n g e s t a m o n g t h e f o l l o w i n g s u f f i x e s ,
388 
389  * ( a ) e n e r e s t
390 
391  * ( b ) s t ( p r e c e d e d b y a v a l i d s t - e n d i n g , i t s e l f p r e c e d e d b y a t l e a s t 3 l e t t e r s )
392 
393  * a n d d e l e t e i f i n R 1 .
394 
395  *
396 
397  * ( F o r e x a m p l e , d e r b s t e n - > d e r b s t b y s t e p 1 , a n d d e r b s t - > d e r b b y s t e p 2 , s i n c e b i s a v a l i d s t - e n d i n g , a n d i s p r e c e d e d b y j u s t 3 l e t t e r s )
398 
399  * /
400 
401  p r i v a t e v o i d S t e p 2 ( )
402 
403  {
404 
405  i f ( R 1 < 0 )
406 
407  r e t u r n ;
408 
409  / / e n e r e s t
410 
411  i f ( E n d s W i t h ( " e s t " ) )
412 
413  {
414 
415  i f ( ( S T R _ S I Z E - R 1 ) > = 3 )
416 
417  C u t E n d ( 3 ) ;
418 
419  }
420 
421  e l s e i f ( E n d s W i t h ( " e n " ) | | E n d s W i t h ( " e r " ) )
422 
423  {
424 
425  i f ( ( S T R _ S I Z E - R 1 ) > = 2 )
426 
427  C u t E n d ( 2 ) ;
428 
429  }
430 
431  / / b , d , f , g , h , k , l , m , n o r t
432 
433  e l s e i f ( E n d s W i t h ( " b s t " ) | | E n d s W i t h ( " d s t " ) | | E n d s W i t h ( " f s t " ) | |
434 
435  E n d s W i t h ( " g s t " ) | | E n d s W i t h ( " h s t " ) | | E n d s W i t h ( " k s t " ) | |
436 
437  E n d s W i t h ( " l s t " ) | | E n d s W i t h ( " m s t " ) | | E n d s W i t h ( " n s t " ) | |
438 
439  E n d s W i t h ( " t s t " ) )
440 
441  {
442 
443  / / p r e c e d e d b y a t l e a s t 3 l e t t e r s
444 
445  i f ( S T R _ S I Z E > 5 )
446 
447  {
448 
449  i f ( ( S T R _ S I Z E - R 1 ) > = 2 )
450 
451  C u t E n d ( 2 ) ;
452 
453  }
454 
455  }
456 
457  }
458 
459 
460 
461  p r i v a t e v o i d S t e p 3 ( )
462 
463  {
464 
465  i f ( ( R 2 < 0 ) | | ( R 1 < 0 ) )
466 
467  r e t u r n ;
468 
469  / *
470 
471  * S e a r c h f o r t h e l o n g e s t a m o n g t h e f o l l o w i n g s u f f i x e s ,
472 
473  * a n d p e r f o r m t h e a c t i o n i n d i c a t e d .
474 
475  * e n d u n g
476 
477  * d e l e t e i f i n R 2
478 
479  * i f p r e c e d e d b y i g , d e l e t e i f i n R 2 a n d n o t p r e c e d e d b y e
480 
481  * /
482 
483  i f ( E n d s W i t h ( " e n d " ) | | E n d s W i t h ( " u n g " ) )
484 
485  {
486 
487  i f ( ( S T R _ S I Z E - R 2 ) > = 3 )
488 
489  C u t E n d ( 3 ) ;
490 
491  i f ( E n d s W i t h ( " i g " ) & & ( w o r d _ b u f f e r [ ( S T R _ S I Z E - 3 ) ] ! = ' e ' ) )
492 
493  {
494 
495  i f ( ( S T R _ S I Z E - R 2 ) > = 2 )
496 
497  C u t E n d ( 2 ) ;
498 
499  }
500 
501  }
502 
503  / *
504 
505  * i g i k i s c h
506 
507  * d e l e t e i f i n R 2 a n d n o t p r e c e d e d b y e
508 
509  * /
510 
511  e l s e i f ( ( E n d s W i t h ( " i g " ) | | E n d s W i t h ( " i k " ) ) & & ( w o r d _ b u f f e r [ ( S T R _ S I Z E - 3 ) ] ! = ' e ' ) )
512 
513  {
514 
515  i f ( ( S T R _ S I Z E - R 2 ) > = 2 )
516 
517  C u t E n d ( 2 ) ;
518 
519  }
520 
521  e l s e i f ( E n d s W i t h ( " i s c h " ) & & ( w o r d _ b u f f e r [ ( S T R _ S I Z E - 5 ) ] ! = ' e ' ) )
522 
523  {
524 
525  i f ( ( S T R _ S I Z E - R 2 ) > = 4 )
526 
527  C u t E n d ( 4 ) ;
528 
529  }
530 
531  / *
532 
533  * l i c h h e i t
534 
535  * d e l e t e i f i n R 2
536 
537  * i f p r e c e d e d b y e r o r e n , d e l e t e i f i n R 1
538 
539  * /
540 
541  e l s e i f ( E n d s W i t h ( " l i c h " ) | | E n d s W i t h ( " h e i t " ) )
542 
543  {
544 
545  C u t E n d ( 4 ) ;
546 
547  / / i f p r e c e d e d b y e r o r e n , d e l e t e i f i n R 1
548 
549  i f ( E n d s W i t h ( " e n " ) | | E n d s W i t h ( " e r " ) )
550 
551  {
552 
553  i f ( ( S T R _ S I Z E - R 1 ) > = 2 )
554 
555  C u t E n d ( 2 ) ;
556 
557  e l s e
558 
559  S T R _ S I Z E + = 4 ;
560 
561  }
562 
563  e l s e
564 
565  {
566 
567  S T R _ S I Z E + = 4 ;
568 
569  i f ( ( S T R _ S I Z E - R 2 ) > = 4 )
570 
571  C u t E n d ( 4 ) ;
572 
573  }
574 
575  }
576 
577  / *
578 
579  * k e i t
580 
581  * d e l e t e i f i n R 2
582 
583  * i f p r e c e d e d b y l i c h o r i g , d e l e t e i f i n R 2
584 
585  * /
586 
587  e l s e i f ( E n d s W i t h ( " k e i t " ) )
588 
589  {
590 
591  i f ( ( S T R _ S I Z E - R 2 ) > = 4 )
592 
593  C u t E n d ( 4 ) ;
594 
595  / / i f p r e c e d e d b y l i c h o r i g , d e l e t e i f i n R 2
596 
597  i f ( E n d s W i t h ( " i g " ) )
598 
599  {
600 
601  i f ( ( S T R _ S I Z E - R 2 ) > = 2 )
602 
603  C u t E n d ( 2 ) ;
604 
605  }
606 
607  e l s e i f ( E n d s W i t h ( " l i c h " ) )
608 
609  {
610 
611  i f ( ( S T R _ S I Z E - R 2 ) > = 4 )
612 
613  C u t E n d ( 4 ) ;
614 
615  }
616 
617  }
618 
619  }
620 
621 
622 
623  / / T u r n U a n d Y b a c k i n t o l o w e r c a s e ,
624 
625  / / a n d r e m o v e t h e u m l a u t a c c e n t f r o m a , o a n d u .
626 
627  p r i v a t e v o i d F i n a l l y ( )
628 
629  {
630 
631  f o r ( i n t i = 0 ; i < S T R _ S I Z E ; + + i )
632 
633  {
634 
635  s w i t c h ( w o r d _ b u f f e r [ i ] )
636 
637  {
638 
639  c a s e ' ä' : w o r d _ b u f f e r [ i ] = ' a ' ; b r e a k ; c a s e ' U ' : w o r d _ b u f f e r [ i ] = ' u ' ; b r e a k ; c a s e ' ü ' : w o r d _ b u f f e r [ i ] = ' u ' ; b r e a k ; c a s e ' Y ' : w o r d _ b u f f e r [ i ] = ' y ' ; b r e a k ; c a s e ' ö ' : w o r d _ b u f f e r [ i ] = ' o ' ; b r e a k ; d e f a u l t : b r e a k ; } } } p r i v a t e s t r i n g S t e m ( ) { p r e p r o c e s s ( ) ; S t e p 1 ( ) ; S t e p 2 ( ) ; S t e p 3 ( ) ; F i n a l l y ( ) ; / / r e t u r n s t e m e d w o r d r e t u r n n e w s t r i n g ( w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } i n t c o u n t e r = 0 ; / / / < s u m m a r y > / / / S t e m s t e r m s i n t h e i n p u t s t r i n g / / / < / s u m m a r y > / / / < p a r a m n a m e = " w o r d " > I n p u t s t r i n g < / p a r a m > / / / < r e t u r n s > S t e m m e d t e r m s < / r e t u r n s > p u b l i c s t r i n g S t e m ( s t r i n g w o r d ) { i f ( c o u n t e r > 0 ) t h r o w n e w E x c e p t i o n ( " G e r m a n s t e m m e r i s n o t r e e n t e r a b l e . C r e a t e n e w i n s t a n c e " ) ; I n t e r l o c k e d . I n c r e m e n t ( r e f c o u n t e r ) ; t r y { W o r d = w o r d . T o L o w e r I n v a r i a n t ( ) ; r e t u r n S t e m ( ) ; } f i n a l l y { I n t e r l o c k e d . D e c r e m e n t ( r e f c o u n t e r ) ; } } p r i v a t e s t r i n g W o r d { g e t { r e t u r n n e w s t r i n g ( w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } s e t { S e t I n i t S t a t e ( ) ; S e t W o r d ( v a l u e ) ; } } } } ' :
640 
641  w o r d _ b u f f e r [ i ] = ' a ' ; b r e a k ;
642 
643  c a s e ' U ' :
644 
645  w o r d _ b u f f e r [ i ] = ' u ' ; b r e a k ;
646 
647  c a s e ' ü' : w o r d _ b u f f e r [ i ] = ' u ' ; b r e a k ; c a s e ' Y ' : w o r d _ b u f f e r [ i ] = ' y ' ; b r e a k ; c a s e ' ö ' : w o r d _ b u f f e r [ i ] = ' o ' ; b r e a k ; d e f a u l t : b r e a k ; } } } p r i v a t e s t r i n g S t e m ( ) { p r e p r o c e s s ( ) ; S t e p 1 ( ) ; S t e p 2 ( ) ; S t e p 3 ( ) ; F i n a l l y ( ) ; / / r e t u r n s t e m e d w o r d r e t u r n n e w s t r i n g ( w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } i n t c o u n t e r = 0 ; / / / < s u m m a r y > / / / S t e m s t e r m s i n t h e i n p u t s t r i n g / / / < / s u m m a r y > / / / < p a r a m n a m e = " w o r d " > I n p u t s t r i n g < / p a r a m > / / / < r e t u r n s > S t e m m e d t e r m s < / r e t u r n s > p u b l i c s t r i n g S t e m ( s t r i n g w o r d ) { i f ( c o u n t e r > 0 ) t h r o w n e w E x c e p t i o n ( " G e r m a n s t e m m e r i s n o t r e e n t e r a b l e . C r e a t e n e w i n s t a n c e " ) ; I n t e r l o c k e d . I n c r e m e n t ( r e f c o u n t e r ) ; t r y { W o r d = w o r d . T o L o w e r I n v a r i a n t ( ) ; r e t u r n S t e m ( ) ; } f i n a l l y { I n t e r l o c k e d . D e c r e m e n t ( r e f c o u n t e r ) ; } } p r i v a t e s t r i n g W o r d { g e t { r e t u r n n e w s t r i n g ( w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } s e t { S e t I n i t S t a t e ( ) ; S e t W o r d ( v a l u e ) ; } } } } ' :
648 
649  w o r d _ b u f f e r [ i ] = ' u ' ; b r e a k ;
650 
651  c a s e ' Y ' :
652 
653  w o r d _ b u f f e r [ i ] = ' y ' ; b r e a k ;
654 
655  c a s e ' ö' : w o r d _ b u f f e r [ i ] = ' o ' ; b r e a k ; d e f a u l t : b r e a k ; } } } p r i v a t e s t r i n g S t e m ( ) { p r e p r o c e s s ( ) ; S t e p 1 ( ) ; S t e p 2 ( ) ; S t e p 3 ( ) ; F i n a l l y ( ) ; / / r e t u r n s t e m e d w o r d r e t u r n n e w s t r i n g ( w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } i n t c o u n t e r = 0 ; / / / < s u m m a r y > / / / S t e m s t e r m s i n t h e i n p u t s t r i n g / / / < / s u m m a r y > / / / < p a r a m n a m e = " w o r d " > I n p u t s t r i n g < / p a r a m > / / / < r e t u r n s > S t e m m e d t e r m s < / r e t u r n s > p u b l i c s t r i n g S t e m ( s t r i n g w o r d ) { i f ( c o u n t e r > 0 ) t h r o w n e w E x c e p t i o n ( " G e r m a n s t e m m e r i s n o t r e e n t e r a b l e . C r e a t e n e w i n s t a n c e " ) ; I n t e r l o c k e d . I n c r e m e n t ( r e f c o u n t e r ) ; t r y { W o r d = w o r d . T o L o w e r I n v a r i a n t ( ) ; r e t u r n S t e m ( ) ; } f i n a l l y { I n t e r l o c k e d . D e c r e m e n t ( r e f c o u n t e r ) ; } } p r i v a t e s t r i n g W o r d { g e t { r e t u r n n e w s t r i n g ( w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ; } s e t { S e t I n i t S t a t e ( ) ; S e t W o r d ( v a l u e ) ; } } } } ' :
656 
657  w o r d _ b u f f e r [ i ] = ' o ' ; b r e a k ;
658 
659  d e f a u l t : b r e a k ;
660 
661  }
662 
663  }
664 
665  }
666 
667 
668 
669  p r i v a t e s t r i n g S t e m ( )
670 
671  {
672 
673  p r e p r o c e s s ( ) ;
674 
675  S t e p 1 ( ) ;
676 
677  S t e p 2 ( ) ;
678 
679  S t e p 3 ( ) ;
680 
681  F i n a l l y ( ) ;
682 
683  / / r e t u r n s t e m e d w o r d
684 
685  r e t u r n n e w s t r i n g ( w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ;
686 
687  }
688 
689 
690 
691  i n t c o u n t e r = 0 ;
692 
693 
694 
695  / / / < s u m m a r y >
696 
697  / / / S t e m s t e r m s i n t h e i n p u t s t r i n g
698 
699  / / / < / s u m m a r y >
700 
701  / / / < p a r a m n a m e = " w o r d " > I n p u t s t r i n g < / p a r a m >
702 
703  / / / < r e t u r n s > S t e m m e d t e r m s < / r e t u r n s >
704 
705  p u b l i c s t r i n g S t e m ( s t r i n g w o r d )
706 
707  {
708 
709  i f ( c o u n t e r > 0 )
710 
711  t h r o w n e w E x c e p t i o n ( " G e r m a n s t e m m e r i s n o t r e e n t e r a b l e . C r e a t e n e w i n s t a n c e " ) ;
712 
713  I n t e r l o c k e d . I n c r e m e n t ( r e f c o u n t e r ) ;
714 
715  t r y
716 
717  {
718 
719  W o r d = w o r d . T o L o w e r I n v a r i a n t ( ) ;
720 
721  r e t u r n S t e m ( ) ;
722 
723  }
724 
725  f i n a l l y
726 
727  {
728 
729  I n t e r l o c k e d . D e c r e m e n t ( r e f c o u n t e r ) ;
730 
731  }
732 
733  }
734 
735 
736 
737  p r i v a t e s t r i n g W o r d
738 
739  {
740 
741  g e t
742 
743  {
744 
745  r e t u r n n e w s t r i n g ( w o r d _ b u f f e r , 0 , S T R _ S I Z E ) ;
746 
747  }
748 
749  s e t
750 
751  {
752 
753  S e t I n i t S t a t e ( ) ;
754 
755  S e t W o r d ( v a l u e ) ;
756 
757  }
758 
759  }
760 
761 
762 
763  }
764 
765 
766 
767  }
768 
769