操作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[i] = String.valueOf(array[i]);
capacity = capacity + array[i].length() + sep.length();
}
char[] result = new char[capacity - sep.length()];
int begin = 0;
for (int i = 0; i < array.length; i++) {
array[i].getChars(0, array[i].length(), result, begin);
begin = begin + array[i].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], *) = "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"], ",") = "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[separator.length][];
for (int i = 0; i < arrseps.length; i++) {
arrseps[i] = separator[i].toCharArray();
if (arrseps[i].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[j].length;
if (end > arrsource.length) {
cansep = false;
continue;
}
int m = i, n = 0;
for (; m < arrsource.length && n < arrseps[j].length; m++, n++) {
if (arrsource[m] != arrseps[j][n]) {
cansep = false;
continue NextSep;
}
}
cansep = true;
break;
}
if (cansep) {
int len = begin - preend;
char[] preChar = new char[len];
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[len];
System.arraycopy(arrsource, preend, preChar, 0, len);
result.add(new String(preChar));

return result.toArray(new String[0]);
}

使用结果:
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("ab de fg", null) = ["ab", "cd", "ef"]
StringExt.split("ab de fg", "") = ["ab", "cd", "ef"]
StringExt.split("ab de fg", "") = ["ab", "cd", "ef"]
StringExt.split("ab de fg", "") = ["ab", "cd", "ef"]
StringExt.split("ab de fg", *, "") = ["ab", "cd", "ef"]
StringExt.split("ab de fg", *, "") = ["ab", "cd", "ef"]
StringExt.split("ab de fg", *, "") = ["ab", "cd", "ef"]
StringExt.split("ab de fg", "", *) = ["ab", "cd", "ef"]
StringExt.split("ab de fg", "", *) = ["ab", "cd", "ef"]
StringExt.split("ab de 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]))
index++;
if (index == n)
break;
int start = index;

while (index < n && !Character.isWhitespace(chars[index]))
index++;
list.add(source.substring(start, index));
splits++;
}
while (index < n && Character.isWhitespace(chars[index]))
index++;
if (index < n) {
list.add(source.substring(index, n));
}
return list.toArray(new String[0]);
}

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[0]);
}



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[i] != '\n' && chars[i] != '\r'
&& Character.getType(chars[i]) != Character.LINE_SEPARATOR)
i++;

/* Skip the line break reading CRLF as one line break */
int eol = i;
if (i < n) {
if (chars[i] == '\r' && i + 1 < n && chars[i + 1] == '\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[0]);
}


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[width - result.length()];
for (int i = 0; i < temp.length; i++) {
temp[i] = 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);
}






广


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值