/
PHPMethods.java
executable file
·344 lines (308 loc) · 8.84 KB
/
PHPMethods.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
/**
* Copyright (C) 2013-2016 Vasilis Vryniotis <bbriniotis@datumbox.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.datumbox.framework.common.utilities;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* This class contains a number of convenience methods which have an API similar
* to PHP functions and their are implemented in Java.
*
* @author Vasilis Vryniotis <bbriniotis@datumbox.com>
*/
public class PHPMethods {
private static final Pattern LTRIM = Pattern.compile("^\\s+");
private static final Pattern RTRIM = Pattern.compile("\\s+$");
/**
* Trims spaces on the left.
*
* @param s
* @return
*/
public static String ltrim(String s) {
return LTRIM.matcher(s).replaceAll("");
}
/**
* Trims spaces on the right.
*
* @param s
* @return
*/
public static String rtrim(String s) {
return RTRIM.matcher(s).replaceAll("");
}
/**
* Count the number of substring occurrences.
*
* @param string
* @param substring
* @return
*/
public static int substr_count(final String string, final String substring) {
if(substring.length()==1) {
return substr_count(string, substring.charAt(0));
}
int count = 0;
int idx = 0;
while ((idx = string.indexOf(substring, idx)) != -1) {
++idx;
++count;
}
return count;
}
/**
* Count the number of times a character appears in the string.
*
* @param string
* @param character
* @return
*/
public static int substr_count(final String string, final char character) {
int count = 0;
int n = string.length();
for(int i=0;i<n;i++) {
if(string.charAt(i)==character) {
++count;
}
}
return count;
}
/**
* Matches a string with a regex and replaces the matched components with
* a provided string.
*
* @param regex
* @param replacement
* @param subject
* @return
*/
public static String preg_replace(String regex, String replacement, String subject) {
Pattern p = Pattern.compile(regex);
return preg_replace(p, replacement, subject);
}
/**
* Matches a string with a pattern and replaces the matched components with
* a provided string.
*
* @param pattern
* @param replacement
* @param subject
* @return
*/
public static String preg_replace(Pattern pattern, String replacement, String subject) {
Matcher m = pattern.matcher(subject);
StringBuffer sb = new StringBuffer(subject.length());
while(m.find()){
m.appendReplacement(sb, replacement);
}
m.appendTail(sb);
return sb.toString();
}
/**
* Matches a string with a regex.
*
* @param regex
* @param subject
* @return
*/
public static int preg_match(String regex, String subject) {
Pattern p = Pattern.compile(regex);
return preg_match(p, subject);
}
/**
* Matches a string with a pattern.
*
* @param pattern
* @param subject
* @return
*/
public static int preg_match(Pattern pattern, String subject) {
int matches=0;
Matcher m = pattern.matcher(subject);
while(m.find()){
++matches;
}
return matches;
}
/**
* Rounds a number to a specified precision.
*
* @param d
* @param i
* @return
*/
public static double round(double d, int i) {
double multiplier = Math.pow(10, i);
return Math.round(d*multiplier)/multiplier;
}
/**
* Returns the logarithm of a number at an arbitrary base.
*
* @param d
* @param base
* @return
*/
public static double log(double d, double base) {
if(base==1.0 || base<=0.0) {
throw new IllegalArgumentException("Invalid base for logarithm.");
}
return Math.log(d)/Math.log(base);
}
/**
* Returns a random positive integer
*
* @return
*/
public static int mt_rand() {
return PHPMethods.mt_rand(0,Integer.MAX_VALUE);
}
/**
* Returns a random integer between min and max
*
* @param min
* @param max
* @return
*/
public static int mt_rand(int min, int max) {
return min + (int)(RandomGenerator.getThreadLocalRandom().nextDouble() * ((max - min) + 1));
}
/**
* Returns a random double between min and max
*
* @param min
* @param max
* @return
*/
public static double mt_rand(double min, double max) {
return min + (RandomGenerator.getThreadLocalRandom().nextDouble() * (max - min));
}
/**
* It flips the key and values of a map.
*
* @param <K>
* @param <V>
* @param map
* @return
*/
public static <K,V> Map<V,K> array_flip(Map<K,V> map) {
Map<V,K> flipped = new HashMap<>();
for(Map.Entry<K,V> entry : map.entrySet()) {
flipped.put(entry.getValue(), entry.getKey());
}
return flipped;
}
/**
* Shuffles the values of any array in place.
*
* @param <T>
* @param array
*/
public static <T> void shuffle(T[] array) {
//Implementing Fisher-Yates shuffle
T tmp;
Random rnd = RandomGenerator.getThreadLocalRandom();
for (int i = array.length - 1; i > 0; --i) {
int index = rnd.nextInt(i + 1);
tmp = array[index];
array[index] = array[i];
array[i] = tmp;
}
}
/**
* Sorts an array in ascending order and returns an array with indexes of
* the original order.
*
* @param <T>
* @param array
* @return
*/
public static <T extends Comparable<T>> Integer[] asort(T[] array) {
return _asort(array, false);
}
/**
* Sorts an array in descending order and returns an array with indexes of
* the original order.
*
* @param <T>
* @param array
* @return
*/
public static <T extends Comparable<T>> Integer[] arsort(T[] array) {
return _asort(array, true);
}
private static <T extends Comparable<T>> Integer[] _asort(T[] array, boolean reverse) {
//create an array with the indexes
Integer[] indexes = new Integer[array.length];
for (int i = 0; i < array.length; ++i) {
indexes[i] = i;
}
//sort the indexes first
Comparator<Integer> c = (Integer index1, Integer index2) -> array[index1].compareTo(array[index2]);
c = reverse?Collections.reverseOrder(c):c;
Arrays.sort(indexes, c);
//rearrenage the array based on the order of indexes
arrangeByIndex(array, indexes);
return indexes;
}
/**
* Rearranges the array based on the order of the provided indexes.
*
* @param <T>
* @param array
* @param indexes
*/
public static <T> void arrangeByIndex(T[] array, Integer[] indexes) {
if(array.length != indexes.length) {
throw new IllegalArgumentException("The length of the two arrays must match.");
}
//sort the array based on the indexes
for(int i=0;i<array.length;i++) {
int index = indexes[i];
//swap
T tmp = array[i];
array[i] = array[index];
array[index] = tmp;
}
}
/**
* Copies the elements of double array.
*
* @param a
* @return
*/
public static double[] array_clone(double[] a) {
if(a == null) {
return a;
}
return Arrays.copyOf(a, a.length);
}
/**
* Copies the elements of double 2D array.
*
* @param a
* @return
*/
public static double[][] array_clone(double[][] a) {
if(a == null) {
return a;
}
double[][] copy = new double[a.length][];
for(int i=0;i<a.length;i++) {
copy[i] = Arrays.copyOf(a[i], a[i].length);
}
return copy;
}
}