package com.nolanlawson.logcat.util; import java.util.ArrayList; import java.util.List; import android.text.TextUtils; /** * * @author nolan */ public class StringUtil { /** * Pad the specified number of spaces to the input string to make it that length * @param input * @param size * @return */ public static String padLeft(String input, int size) { if (input.length() > size) { throw new IllegalArgumentException("input must be shorter than or equal to the number of spaces: " + size); } StringBuilder sb = new StringBuilder(); for (int i = input.length(); i < size; i ++) { sb.append(" "); } return sb.append(input).toString(); } /** * same as the String.split(), except it doesn't use regexes, so it's faster. * * @param str - the string to split up * @param delimiter the delimiter * @return the split string */ public static String[] split(String str, String delimiter) { List<String> result = new ArrayList<String>(); int lastIndex = 0; int index = str.indexOf(delimiter); while (index != -1) { result.add(str.substring(lastIndex, index)); lastIndex = index + delimiter.length(); index = str.indexOf(delimiter, index + delimiter.length()); } result.add(str.substring(lastIndex, str.length())); return ArrayUtil.toArray(result, String.class); } /* * Replace all occurances of the searchString in the originalString with the replaceString. Faster than the * String.replace() method. Does not use regexes. * <p/> * If your searchString is empty, this will spin forever. * * * @param originalString * @param searchString * @param replaceString * @return */ public static String replace(String originalString, String searchString, String replaceString) { StringBuilder sb = new StringBuilder(originalString); int index = sb.indexOf(searchString); while (index != -1) { sb.replace(index, index + searchString.length(), replaceString); index += replaceString.length(); index = sb.indexOf(searchString, index); } return sb.toString(); } public static String join(String delimiter, String[] strings) { if (strings.length == 0) { return ""; } StringBuilder stringBuilder = new StringBuilder(); for (String str : strings) { stringBuilder.append(" ").append(str); } return stringBuilder.substring(1); } public static int computeLevenshteinDistance(CharSequence str1, CharSequence str2) { int commonPrefixLength = findCommonPrefixLength(str1, str2); if (commonPrefixLength == str1.length() && commonPrefixLength == str2.length()) { return 0; // same exact string } int commonSuffixLength = findCommonSuffixLength(str1, str2, commonPrefixLength); str1 = str1.subSequence(commonPrefixLength, str1.length() - commonSuffixLength); str2 = str2.subSequence(commonPrefixLength, str2.length() - commonSuffixLength); int[][] distance = new int[str1.length() + 1][str2.length() + 1]; for (int i = 0; i <= str1.length(); i++) { distance[i][0] = i; } for (int j = 0; j <= str2.length(); j++) { distance[0][j] = j; } for (int i = 1; i <= str1.length(); i++) { for (int j = 1; j <= str2.length(); j++) { distance[i][j] = minimum( distance[i - 1][j] + 1, distance[i][j - 1] + 1, distance[i - 1][j - 1] + ((str1.charAt(i - 1) == str2.charAt(j - 1)) ? 0 : 1)); } } int dist = distance[str1.length()][str2.length()]; return dist; } private static int findCommonPrefixLength(CharSequence str1, CharSequence str2) { int length = (Math.min(str1.length(), str2.length())); for (int i = 0; i < length; i++) { if (str1.charAt(i) != str2.charAt(i)) { return i; } } return 0; } private static int findCommonSuffixLength(CharSequence str1, CharSequence str2, int commonPrefixLength) { int length = (Math.min(str1.length(), str2.length())); for (int i = 0; i < length - commonPrefixLength; i++) { if (str1.charAt(str1.length() - i - 1) != str2.charAt(str2.length() - i - 1)) { return i; } } return 0; } private static int minimum(int a, int b, int c) { return Math.min(Math.min(a, b), c); } public static String join(int[] arr, String delimiter) { if (arr.length == 0) { return ""; } StringBuilder sb = new StringBuilder(); for (int i : arr) { sb.append(delimiter).append(Integer.toString(i)); } return sb.substring(delimiter.length()); } public static String capitalize(String str) { StringBuilder sb = new StringBuilder(str); for (int i = 0; i < sb.length(); i++) { if (i == 0 || Character.isWhitespace(sb.charAt(i - 1))) { sb.replace(i, i + 1, Character.toString(Character.toUpperCase(sb.charAt(i)))); } } return sb.toString(); } public static String nullToEmpty(CharSequence str) { return str == null ? "" : str.toString(); } public static boolean isEmptyOrWhitespaceOnly(String str) { if (TextUtils.isEmpty(str)) { return true; } for (int i = 0; i < str.length(); i++) { if (!Character.isWhitespace(str.charAt(i))) { return false; } } return true; } /** * same as String.contains, but ignores case. * @param str * @param query * @return */ public static boolean containsIgnoreCase(String str, String query) { if (str != null && query != null) { int limit = str.length() - query.length() + 1; for (int i = 0; i < limit; i++) { if (matchesIgnoreCase(str, query, i)) { return true; } } } return false; } private static boolean matchesIgnoreCase(String str, String query, int startingAt) { int len = query.length(); for (int i = 0; i < len; i++) { if (Character.toUpperCase(query.charAt(i)) != Character.toUpperCase(str.charAt(startingAt + i))) { return false; } } return true; } }