先说下我重写trim()的思路:###
- trim()功能:清除字符串前后两端的'空格'
- 我分了前后两步处理:
- 前缀空格:判断是空格,遍历数组,用后一位元素替换前一位,遍历一次所有元素前移一位,最后一位设为空格符,留给处理后缀空格的部分解决(开始还傻不拉几地将元素赋值为类型的初始值,混淆了初始值也可以是元素值);
- 后缀空格:也是设循环,判断最后一位是否为空格。如果是将数组长度减1,即丢弃最末尾的空格元素;
- 具体思路:
当循环条件判断出结果为空时,声明一个新数组,并对其动态初始化,长度为原数组的长度-1(即 原数组.length-1);再用新数组的长度设置循环条件,通过遍历将原数组元素对应赋值给新数组元素;最后,直接把新数组的引用赋值给原数组(相当于就有两个引用指向同一片堆内存空间,也可以在原数组指向新数组后对新数组的引用赋值为null,等待垃圾回收器GC清理即可);至此,原数组引用所指向的数组内容就是去掉最后一位空格元素的了。
- 具体思路:
简单说就是把一个数组的数据复制到比它长度小1的数组中,而后再用原来的数组引用去指向新数组。
@Test
public void overTrim(){
String str = " 12 345 abc de ";
//将String转换成char[]
char[] ch = str.toCharArray();
int count = 0;
while(count<ch.length){
//前缀
while (ch[0] == 32){
for (int i = 0; i < ch.length-1; i++) {
ch[i] = ch[i+1];
}
ch[ch.length-1] = 32;
}
//尾部
while (ch[ch.length-1] == 32){
//新建一个临时数组,长度比原数组-1,用于接收原数组的数据
char[] ch2 = new char[ch.length-1];
for (int i = 0; i < ch2.length; i++) {
ch2[i] = ch[i];
}
ch = ch2;//将原数组引用指向新数组的地址,转型成功!
ch2 = null;//此时ch2就成了多余的引用了,赋值为null即为无用引用,交给GC处理
}
count++;
}
String str2 = String.valueOf(ch);
System.out.println(str2);
}
}
手打空格也行' ',不过看不见的东西总容易出错,我就用空格在ASCII码中对应十进制数32