1
+ package SomeUtils .Pattern ;
2
+
3
+ public class PatternFinder {
4
+ //Just a demo
5
+ public static void main (String []a ){
6
+ final PatternFinder finder =new PatternFinder ("He had three simple rules by which he lived. The first was to never eat blue food. There was nothing in nature that was edible that was blue. People often asked about blueberries, but everyone knows those are actually purple. He understood it was one of the stranger rules to live by, but it had served him well thus far in the 50+ years of his life." );
7
+ System .out .println ("Find the occurence for... nothing:" );
8
+ for (String [] s :finder .findAll (0 ).getArray ()){
9
+ System .out .println (java .util .Arrays .toString (s ));
10
+ }
11
+ System .out .println ("Find the occurence for everything:" );
12
+ for (String [] s :finder .findAll (finder .getInput ().length ()).getArray ()){
13
+ System .out .println (java .util .Arrays .toString (s ));
14
+ }
15
+ System .out .println ("Find the occurence for each character:" );
16
+ for (String [] s :finder .findAll (1 ).getArray ()){
17
+ System .out .println (java .util .Arrays .toString (s ));
18
+ }
19
+ System .out .println ("~substring of length 4:" );
20
+ for (String [] s :finder .findAll (4 ).getArray ()){
21
+ System .out .println (java .util .Arrays .toString (s ));
22
+ }
23
+ System .out .println ("~character but without those that only shows up once:" );
24
+ for (String [] s :finder .findAll (1 ).removeOnes ().getArray ()){
25
+ System .out .println (java .util .Arrays .toString (s ));
26
+ }
27
+ System .out .println ("~substring of length 4 but without those that only shows up once:" );
28
+ for (String [] s :finder .findAll (4 ).removeOnes ().getArray ()){
29
+ System .out .println (java .util .Arrays .toString (s ));
30
+ }
31
+ }
32
+ //The class itself
33
+ final String input ;
34
+ String [][] output ;
35
+ public PatternFinder (final String in ){
36
+ input =in ;
37
+ }
38
+ public PatternFinder findAll (final int size ){
39
+ if (size ==input .length ()){
40
+ output =new String [][]{{input , "1" }};
41
+ return this ;
42
+ }
43
+ if (size <1 ){
44
+ //Not going to thow an Exception, for now.
45
+ //Decode "Infinity" using `Double.parseDouble("Infinity");`
46
+ output =new String [][]{{"" , "Infinity" }};
47
+ return this ;
48
+ }
49
+ //Optimized for 1 char situation.
50
+ //More or less, O(n2).
51
+ if (size ==1 ){
52
+ final int [] num =new int [input .length ()];
53
+ //StringBuilder doesn't make sense in this context.
54
+ String builder ="" ;
55
+ String temp =input ;
56
+ int ind =0 ;
57
+ while (temp .length ()!=0 ){
58
+ final String temp2 =temp .replace (temp .substring (0 , 1 ), "" );
59
+ num [ind ]=temp .length ()-temp2 .length ();
60
+ builder +=temp .substring (0 , 1 );
61
+ temp =temp2 ;
62
+ ind ++;
63
+ }
64
+ final char [] arr =builder .toCharArray ();
65
+ final String [][] result =new String [arr .length ][2 ];
66
+ for (int i =0 ;i <result .length ;i ++){
67
+ result [i ][0 ]=Character .toString (arr [i ]);
68
+ result [i ][1 ]=String .valueOf (num [i ]);
69
+ }
70
+ output =result ;
71
+ return this ;
72
+ }
73
+ //More or less, O(n3). Don't blame me for that.
74
+ final int [] num =new int [input .length ()];
75
+ final String [] builder =new String [input .length ()];
76
+ int ind =0 ;
77
+ for (int i =0 ;i +size <input .length ();i ++){
78
+ final String substring =input .substring (i , i +size );
79
+ for (int j =0 ;j <builder .length ;j ++){
80
+ if (builder [j ]!=null &&(
81
+ builder [j ].equals (substring )||builder [j ]==substring
82
+ )
83
+ )
84
+ break ;
85
+ if (j ==builder .length -1 ){
86
+ num [ind ]=(int )((input .length ()-input .replace (
87
+ substring , ""
88
+ ).length ())/size );
89
+ builder [ind ]=substring ;
90
+ ind ++;
91
+ break ;
92
+ }
93
+ }
94
+ }
95
+ final String [][] result =new String [ind ][2 ];
96
+ for (int i =0 ;i <result .length ;i ++){
97
+ result [i ][0 ]=builder [i ];
98
+ result [i ][1 ]=String .valueOf (num [i ]);
99
+ }
100
+ output =result ;
101
+ return this ;
102
+ }
103
+ public PatternFinder removeOnes (){
104
+ final StringBuilder builder =new StringBuilder ();
105
+ for (int i =0 ;i <output .length ;i ++){
106
+ final String s =output [i ][1 ];
107
+ if (s .equals ("1" )||s =="1" )
108
+ builder .append (String .valueOf (i )+"," );
109
+ }
110
+ builder .delete (builder .length ()-1 , builder .length ()-1 );
111
+ final String [] removeMe =builder .toString ().split ("," );
112
+ if (removeMe .length ==output .length ){
113
+ output =new String [0 ][2 ];
114
+ return this ;
115
+ }
116
+ final String [][] out =new String [output .length -removeMe .length ][2 ];
117
+ int ind =0 ;
118
+ int ind2 =0 ;
119
+ for (int i =0 ;i <output .length ;i ++){
120
+ if (Integer .parseInt (removeMe [ind ])==i )
121
+ ind ++;
122
+ else {
123
+ out [ind2 ][0 ]=output [i ][0 ];
124
+ out [ind2 ][1 ]=output [i ][1 ];
125
+ ind2 ++;
126
+ }
127
+ }
128
+ output =out ;
129
+ return this ;
130
+ }
131
+ public String getInput (){
132
+ return input ;
133
+ }
134
+ public String [][] toArray (){
135
+ return getArray ();
136
+ }
137
+ public String [][] getArray (){
138
+ return output ;
139
+ }
140
+ }
0 commit comments