操作String的几个Method
public static String join(String[] array, String sep) { if (array == null) { return null; } if (array.length == 0) { return ""; } if (sep == null) { sep = ""; } // 预处理,得到长度。 int capacity = 0; for (int i = 0; i < array.length; i++) { array = String.valueOf(array); capacity = capacity + array.length() + sep.length(); } char[] result = new char; int begin = 0; for (int i = 0; i < array.length; i++) { array.getChars(0, array.length(), result, begin); begin = begin + array.length(); if (begin == result.length) { break; } sep.getChars(0, sep.length(), result, begin); begin = begin + sep.length(); } return new String(result); }使用结果:
StringExt.join(null, *) = null
StringExt.join([], *) = ""
StringExt.join(, *) = "null"
StringExt.join(["a", "b", "c"], "--")= "a--b--c"
StringExt.join(["a", "b", "c"], null)= "abc"
StringExt.join(["a", "b", "c"], "") = "abc"
StringExt.join(, ",") = "null,,a"
第二个
public static String join2(String[] array, String sep) { if (array == null) { return null; } if (array.length == 0) { return ""; } if (sep == null) { sep = ""; } StringBuilder sb = new StringBuilder(); for (String tkey : array) { sb.append(tkey); sb.append(sep); } int len = sb.length(); sb.delete(len - sep.length(), len); return sb.toString(); }
两个join使用结果是一样了,第一个可能快一点点,第二个看起来更简捷。
org.apache.commons.lang.StringUtils中有相似的方法。
/** * * @param source * @param separator * @return */ public static String[] split(String source, String... separator) { if (source == null) { return null; } if (source.length() == 0) { return new String[] { "" }; } if (separator == null) { return splitfields(source, null, -1); } ArrayList<String> result = new ArrayList<String>(); char[] arrsource = source.toCharArray(); char[][] arrseps = new char[]; for (int i = 0; i < arrseps.length; i++) { arrseps = separator.toCharArray(); if (arrseps.length == 0) { return splitfields(source, null, -1); } } int preend = 0; int begin = 0; boolean cansep = false; int end = 0; for (int i = 0; i < arrsource.length; i++) { begin = i; NextSep: for (int j = 0; j < arrseps.length; j++) { end = i + arrseps.length; if (end > arrsource.length) { cansep = false; continue; } int m = i, n = 0; for (; m < arrsource.length && n < arrseps.length; m++, n++) { if (arrsource != arrseps) { cansep = false; continue NextSep; } } cansep = true; break; } if (cansep) { int len = begin - preend; char[] preChar = new char; System.arraycopy(arrsource, preend, preChar, 0, len); result.add(new String(preChar)); preend = end; cansep = false; i = end - 1; begin = i; } } int len = begin - preend + 1; char[] preChar = new char; System.arraycopy(arrsource, preend, preChar, 0, len); result.add(new String(preChar)); return result.toArray(new String); }
使用结果:
StringExt.split(null, *) = null
StringExt.split("", *) = [""]
StringExt.split("ab de fg", null) = ["ab", "cd", "ef"]
StringExt.split("ab de fg", null) = ["ab", "cd", "ef"]
StringExt.split("abde fg", null) = ["ab", "cd", "ef"]
StringExt.split("ab de fg", "") = ["ab", "cd", "ef"]
StringExt.split("ab de fg", "") = ["ab", "cd", "ef"]
StringExt.split("abde fg", "") = ["ab", "cd", "ef"]
StringExt.split("ab de fg", *, "") = ["ab", "cd", "ef"]
StringExt.split("ab de fg", *, "") = ["ab", "cd", "ef"]
StringExt.split("abde fg", *, "") = ["ab", "cd", "ef"]
StringExt.split("ab de fg", "", *) = ["ab", "cd", "ef"]
StringExt.split("ab de fg", "", *) = ["ab", "cd", "ef"]
StringExt.split("abde fg", "", *) = ["ab", "cd", "ef"]
StringExt.split("ab:cd:ef", ":") = ["ab", "cd", "ef"]
StringExt.split("ab,,,cd,,,ef", ",,,") = ["ab", "cd", "ef"]
StringExt.split("ab,,,cd;;;ef", ",,,", ";;;") = ["ab", "cd", "ef"]
StringExt.split("ab,,,,,,ef", ",,,") = ["ab", "", "ef"]
split中的分割符可以是多个,为了分割文件方便。
org.apache.commons.lang.StringUtils中有相似的split方法,但是用来分割csv格式的文件,不是太好用,如:
1;2;3;4;5
a;b;;d;e
9;8;7;6;5
如果要用“;”分割,第二列就对不齐,把每二列中分割为空的扔掉了,不明白apache为啥要这样实现,难道是为了跟String.split保持一致?
public static String[] split(String source) { return split(source, null, -1); } public static String[] split(String source, String sep) { return split(source, sep, -1); } public static String[] split(String source, String sep, int maxsplit) { if (source == null) { return null; } if (source.length() == 0) { return new String[] { "" }; } if (sep != null && sep.length() != 0) return splitfields(source, sep, maxsplit); ArrayList<String> list = new ArrayList<String>(); char[] chars = source.toCharArray(); int n = chars.length; if (maxsplit < 0) maxsplit = n; int splits = 0; int index = 0; while (index < n && splits < maxsplit) { while (index < n && Character.isWhitespace(chars)) index++; if (index == n) break; int start = index; while (index < n && !Character.isWhitespace(chars)) index++; list.add(source.substring(start, index)); splits++; } while (index < n && Character.isWhitespace(chars)) index++; if (index < n) { list.add(source.substring(index, n)); } return list.toArray(new String); } private static String[] splitfields(String source, String sep, int maxsplit) { ArrayList<String> list = new ArrayList<String>(); int length = source.length(); if (maxsplit < 0) maxsplit = length; int lastbreak = 0; int splits = 0; int sepLength = sep.length(); while (splits < maxsplit) { int index = source.indexOf(sep, lastbreak); if (index == -1) break; splits += 1; list.add(source.substring(lastbreak, index)); lastbreak = index + sepLength; } if (lastbreak <= length) { list.add(source.substring(lastbreak, length)); } return list.toArray(new String); }
public static String[] splitlines(String source) { return splitlines(source, false); } public static String[] splitlines(String source, boolean keepends) { ArrayList<String> list = new ArrayList<String>(); char[] chars = source.toCharArray(); int n = chars.length; int j = 0; for (int i = 0; i < n;) { /* Find a line and append it */ while (i < n && chars != '\n' && chars != '\r' && Character.getType(chars) != Character.LINE_SEPARATOR) i++; /* Skip the line break reading CRLF as one line break */ int eol = i; if (i < n) { if (chars == '\r' && i + 1 < n && chars == '\n') i += 2; else i++; if (keepends) eol = i; } list.add(source.substring(j, eol)); j = i; } if (j < n) { list.add(source.substring(j, n)); } return list.toArray(new String); }
splitlines按行分割,换行符可以是“\n”或“\r\n”。
org.apache.commons.lang.StringUtils中也有相似的方法。
以上方法有些是自己实现的,有些是从源码中Copy的。
对齐的实现,左对齐,右对齐等
public static String ljust(String src, int width) { return expand(src, width, ' ', true); } public static String rjust(String src, int width) { return expand(src, width, ' ', false); } public static String ljust(String src, int width, char fillchar) { return expand(src, width, fillchar, true); } public static String rjust(String src, int width, char fillchar) { return expand(src, width, fillchar, false); } public static String expand(String src, int width, char fillchar, boolean postfix) { String result = src; if (result.length() < width) { char[] temp = new char; for (int i = 0; i < temp.length; i++) { temp = fillchar; } if (postfix) { result = result + new String(temp); } else { result = new String(temp) + result; } } return result; }
替换的实现,嘿嘿,很搞笑吧:
public static String repalce(String source, String oldStr, String newStr) { String[] split = split(source, oldStr); return join(split, newStr); }
此
行
留
给
广
告
商
吧
页:
[1]