黑马程序员技术交流社区

标题: String类中的trim()方法问题 [打印本页]

作者: 宋文轩    时间: 2011-11-10 16:15
标题: String类中的trim()方法问题
本帖最后由 宋文轩 于 2011-11-10 16:40 编辑

请教 String类中的trim()方法可以去除回车符吗?谢谢大家。
作者: 宋文轩    时间: 2011-11-10 19:40
自己顶一下,有人解答一下吗?
作者: 咖啡    时间: 2011-11-10 23:14
String.Trim()方法会去除字符串两端,不仅仅是空格字符,它总共能去除25种字符:
('/t', '/n', '/v', '/f', '/r', ' ', '/x0085', '/x00a0', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '?', '/u2028', '/u2029', ' ', '?')

作者: 肖瑞军    时间: 2011-11-10 23:58
API文档中很具体的。
public String trim()返回字符串的副本,忽略前导空白和尾部空白。
如果此 String 对象表示一个空字符序列,或者此 String 对象表示的字符序列的第一个和最后一个字符的代码都大于 '\u0020'(空格字符),则返回对此 String 对象的引用。

否则,若字符串中没有代码大于 '\u0020' 的字符,则创建并返回一个表示空字符串的新 String 对象。

否则,假定 k 为字符串中代码大于 '\u0020' 的第一个字符的索引,m 为字符串中代码大于 '\u0020' 的最后一个字符的索引。创建一个新的 String 对象,它表示此字符串中从索引 k 处的字符开始,到索引 m 处的字符结束的子字符串,即 this.substring(k, m+1) 的结果。

此方法可用于截去字符串开头和末尾的空白(如上所述)。


返回:
此字符串移除了前导和尾部空白的副本;如果没有前导和尾部空白,则返回此字符串。

作者: 绿影    时间: 2011-11-11 01:21
他实现的方式就是由于String底部是char数组则设定两个采用两个计数器st、len,初始值st=0,len=String.length(),然后从这个char数组两边依次分别拿出每个字符跟' '比较,只要小于或者等于它,就将st加1,len减1,知道不符合条件。说明已经将空格字符去掉完毕。下面是String中trim的源码,
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence
{
    private final char value[];  
    private final int offset;  
    private final int count;
    private int hash; // Default to 0
  
  public String(char value[]) {
        int size = value.length;
        this.offset = 0;
        this.count = size;
        this.value = Arrays.copyOf(value, size);
    }
       
        public String trim() {
        int len = count;
        int st = 0;
        int off = offset;      /* avoid getfield opcode */
        char[] val = value;    /* avoid getfield opcode */

        while ((st < len) && (val[off + st] <= ' ')) {
            st++;
        }
        while ((st < len) && (val[off + len - 1] <= ' ')) {
            len--;
        }
        return ((st > 0) || (len < count)) ? substring(st, len) : this;
}
}

只是,小于' '还有那些char我搞清楚了给你补充!我还没弄明白。因为说明trim方法不仅仅可以去掉我们平常说的空格,还可以去掉编码值小于' '的编码值的字符。
作者: 郭学文    时间: 2011-11-11 02:13
本帖最后由 郭学文 于 2011-11-11 02:13 编辑

可以

你可以测试一下
trim一共可以去掉这些字符:
  1. for (int i = 0; i <=32; i++) {
  2.                         System.out.print((char)i);
  3.                 }
复制代码

作者: 郭学文    时间: 2011-11-11 02:18
  1. ArrayList<Character> cccArrayList= new ArrayList<Character>();
  2.                 for (int i = 0; i <=32; i++) {
  3.                         cccArrayList.add((char)i);
  4.                 }
  5.                 System.out.println(cccArrayList.contains('\r'));
  6.                 System.out.println(cccArrayList.contains('\n'));
复制代码
结果都为true




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2