Parcourir la source

new: StringUtils#wrap(char[])
new: StringTraits

Ranides Atterwim il y a 10 ans
Parent
commit
8c4aa54a9a

+ 73 - 0
assira/src/main/java/net/ranides/assira/text/StringTraits.java

@@ -0,0 +1,73 @@
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+
+package net.ranides.assira.text;
+
+/**
+ *
+ * @author Ranides Atterwim <ranides@gmail.com>
+ */
+public final class StringTraits {
+
+	private StringTraits() {
+		/* utility class */
+	}
+	
+	public static int length(String value) {
+		return null == value ? 0 : value.length();
+	}
+	
+	public static boolean isEmpty(String value) {
+		return null == value || value.isEmpty();
+	}
+	
+	public static boolean isBlank(String value) {
+		return isEmpty(value) || value.trim().isEmpty();
+	}
+	
+	public static int indexOf(CharSequence text, CharSequence pattern) {
+		int[] next = initKMP(pattern);
+		
+		int M = pattern.length();
+		int N = text.length();
+		int i, j;
+		for (i = 0, j = 0; i < N && j < M; i++) {
+			while (j >= 0 && text.charAt(i) != pattern.charAt(j)) {
+				j = next[j];
+			}
+			j++;
+		}
+		return (j == M) ? i - M : -1;
+	}
+	
+	public static boolean contains(CharSequence text, CharSequence pattern) {
+		return indexOf(text, pattern) >= 0;
+	}
+
+	private static int[] initKMP(CharSequence pattern) {
+		int M = pattern.length();
+		int[] next = new int[M];
+		int j = -1;
+		for (int i = 0; i < M; i++) {
+			if (i == 0) {
+				next[i] = -1;
+			}
+			else if (pattern.charAt(i) != pattern.charAt(j)) {
+				next[i] = j;
+			}
+			else {
+				next[i] = next[j];
+			}
+			while (j >= 0 && pattern.charAt(i) != pattern.charAt(j)) {
+				j = next[j];
+			}
+			j++;
+		}
+		return next;
+	}
+		
+}

+ 38 - 0
assira/src/main/java/net/ranides/assira/text/StringUtils.java

@@ -613,6 +613,10 @@ public final class StringUtils {
         return text.substring(istart, iend);
     }
 	
+	public static CharSequence wrap(char[] data) {
+        return new CharWrapper(data, 0, data.length);
+    }
+	
     public static CharSequence repeat(int n, String text) {
         return new NSSequence(n, text);
     }
@@ -699,6 +703,40 @@ public final class StringUtils {
             return new String(data);
         }
 
+    }
+	
+	private static final class CharWrapper implements CharSequence {
+
+        private final char[] data;
+        private final int start;
+        private final int end;
+
+        public CharWrapper(char[] data, int start, int end) { // NOPMD
+            this.data = data;
+            this.start = start;
+            this.end = end;
+        }
+
+        @Override
+        public int length() {
+            return end - start;
+        }
+
+        @Override
+        public char charAt(int index) {
+            return data[index + start];
+        }
+
+        @Override
+        public CharSequence subSequence(int start, int end) {
+            return new CharWrapper(data, this.start+start, this.start+end);
+        }
+
+        @Override
+        public String toString() {
+            return String.valueOf(data, start, length());
+        }
+
     }
 
 }