oaklet 发表于 2013-2-4 19:00:33

操作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]
查看完整版本: 操作String的几个Method