在学习了java中的String类之后,深刻认识到了String类的重要性,因此就自己实现了几个String类的方法。
问题:
1.实现方法 compareTo, 能够实现按照字典序比较字符串大小。
2.实现方法 contains, 能够判定字符串中是否包含子串。
3.实现方法 indexOf, 能够找出字符串子串存在的位置。
4.实现方法 split, 能够指定分割符将字符串拆分成字符串数组(不必支持正则表达式)。
代码:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MyString {
//字符串比较s1大于s2返回值大于零,等于返回0,小于返回小于零
public int compareTo(String s1, String s2){
int shortLen = 0;
//找出较短的字符串,长度记为shortLen
if(s1.length() >= s2.length()){
shortLen = s2.length();
}else{
shortLen = s1.length();
}
//遍历完短的字符串看在shortLen的长度内的字符是否相同
//不相同的话返回对应的值
for(int i = 0; i < shortLen; i++){
if(s1.charAt(i) > s2.charAt(i)){
return 1;
}
if(s1.charAt(i) < s2.charAt(i)){
return -1;
}
}
//如果相同判断两个字符串长度是否相同
//如果相同说明在上边循环执行完没有返回的条件两个字符串在shortLen长度内相等,两个字符串相等
//如果不等看哪个长,返回对应的值
if(s1.length() == s2.length()){
return 0;
}
return (s1.length() - s2.length() > 0) ? 1 : -1;
}
//判断s2是不是s1的子字符串
public boolean contains(String s1, String s2){
//count用来记录在发现s1和s2首字母相同后,进行比较s1从相同点开始是否与s2相同的过程中,记录比较结束进行了几次判断,
// 如果count与s2的长度相等说明比较完了没有提前结束,s2就是s1的子字符串
//如果不相等说明提前结束了,继续s1向下遍历找下一个首字母相同的字符
int count = 0;
for(int i = 0; i < s1.length(); i++){
//找到首字母相同的地方
if(s1.charAt(i) == s2.charAt(0)){
//更新count的值,防止上次内循环count的变化影响
count = 0;
for(int j = 0; j < s2.length(); j++){
//保证遍历到的地方s1还有字符才进行判断
if(i + j < s1.length()) {
//如果有不相同的字符,结束内循环
if (s1.charAt(i + j) != s2.charAt(j)) {
break;
}
count++;
}
}
if(count == s2.length()){
return true;
}
}
}
return false;
}
//从头开始查找s1,看s2是不是s1的子字符串,找到返回位置的开始下标,找不到返回-1
public int indexOf(String s1, String s2){
//只是在判断是不是子字符串的前提下,加上了返回位置开始的下标,同样的道理
int count = 0;
int i = 0;
int j = 0;
for(i = 0; i < s1.length(); i++){
if(s1.charAt(i) == s2.charAt(0)){
count = 0;
for(j = 0; j < s2.length(); j++){
if(i + j < s1.length()) {
if (s1.charAt(i + j) != s2.charAt(j)) {
break;
}
count++;
}
}
if(count == s2.length()){
return i;
}
}
}
return -1;
}
// 能够指定分割符s2将字符串s1拆分成字符串数组(不必支持正则表达式)
public String[] split(String s1, String s2){
//创建一个线性表list,用来保存分割后的字符串
List<String> list = new ArrayList<>();
//如果字符串中有分隔符进行循环中的操作
while(contains(s1, s2)){
//找到开始分割的位置
int index = indexOf(s1, s2);
//将分割符前边的字符串保存下来
String temp = s1.substring(0, index);
//添加到list中
list.add(temp);
//将分割后分隔符前边的字符串去掉,更新要分割的字符串
s1 = s1.substring((temp + s2).length());
}
//因为循环结束的条件是字符串中没有了分割符,所以最后一次循环结束最后一次分割剩下的字符串还没有放到list中
//将其尾插到list中
list.add(s1);
//将list中的字符串提取到str[]数组中
String[] str = new String[list.size()];
for(int i = 0; i < list.size(); i++){
str[i] = list.get(i);
}
return str;
}
public static void main(String[] args) {
MyString s = new MyString();
String s1 = "aa aa ba abc";
String s2 = "abc";
System.out.println(s.compareTo(s1, s2));
System.out.println(s.contains(s1, s2));
System.out.println(s.indexOf(s1, s2));
System.out.println(Arrays.toString(s.split(s1, " ")));
}
}