前言
字符串一般简称为串。在早期的程序设计语言中就引进了串的概念,但其常常以常量的形式作为输入和输出的参数,并不参与运算。随着计算机语言的发展,其不再单单是常量。一个检索关键字就是一个字符串,如“计算机”、“数据结构”等。按关键字进行检索实际就是对字符串进行查找与匹配。提示:以下是本篇文章正文内容,下面案例可供参考
一、串的概念
串(String)是零个或多个字符组成的有限序列。
一般记为:S=”a1a2…an” (n≥0)
n是串中字符的个数,称为串的长度,n=0时的串称为空串。
-
串中任意个连续的字符组成的子序列称为该串的子串。相对地包含子串的串称为主串。通常将字符在串中的序号称为该字符在串中的位置。
-
当且仅当两个串的值相等时,称这两个串是相等的。即只有当两个串的长度相等,并且每个对应位置的字符都相等时才相等。
-
由一个或多个空格字符组成的串,称为空格串,其长度为串中空格字符的个数。空白串即空串。
二、串的基本运算
1.求子串运算 subString(begin, end)返回一个新字符串,它是此字符串的一个字符串。该子字符串从指定的begin处开始,知道索引为 end-1 处的字符
例: "commander”.substring(3,6)= " man "
2.串插入运算 insert(offset, str)
例: "chater”.insert(0, " rac ")= " racchater "
3.串删除运算 delete(begin, end)
例: "commander”.delete(3,6)= "comder "
4. 串比较运算 compareTo(str)
例: “cat”. compareTo(“ cate ”) <0
5.子串定位运算indexOf(str,beging)
返回指定字符串再此字符串第一次出现处的索引
例: " bcaabcaaabc", indexOf(" bca " ,0) =0
" bcaabcaaabc", indexOf(" bca " ,6) =-1
6.指定索引返回值运算charAt(int index)
返回指定索引处的char
例: " bcaabcaaabc", charAt(5) =c
1.示例–先写逻辑类
题目要求:运用串的线性存储结构和基本运算实现从所给字符串中第pos个字符开始查找,返回子串在主串S中的位置。并写一个可以判断两字符串是否相等的方法
先建一个 MyString 类
public class MyString {
private char[] value;//声明一个数组
private int count;//声明count记录数组的长度
//构造一个空的数组对象
public MyString() {
value = new char[0];
count =0;
}
//将输入的参数封装成一个整体对象
public MyString(String str) {
char[] charrary = str.toCharArray();
value = charrary;
count = charrary.length;
}
//重写 toString()方法 将数组对象的值 转为字符串类型便于判断
@Override
public String toString() {
return Arrays.toString(value) ;
}
然后写一个charAt方法和返回长度的方法
/返回指定所以处的char值
public char charAt(int index) {
if(index<0||(index>=count)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}
//返回数组长度
public int length() {
return count;
}
在写返回索引和判断的方法
//返回指定字符串再此字符串第一次出现处的索引
public int indexOf(MyString substr,int start) {
int i = start,j=0,v;
//this 指的是 主串
//在字符串长度范围内进行查找
while(i<this.length()&&j<substr.length()) {
//返回从主串第i个开始的值和子串0位置的值进行对比
//相等则继续向下比较
if(this.charAt(i)==substr.charAt(j)) {
i++;
j++;
}
else {
i=i+1;
j=0;
}
}
if(j==substr.length()) {
v=i-substr.length();
}
else {
v=-1;
}
return v;
}
//判断两字符串是否相等
public static void check(MyString a,MyString b) {
if(a.toString().equals(b.toString())) {
System.out.println("两字符相等");
}
else {
System.out.println("两字符不相等");
}
2.测试类
public class Test2 {
public static void main(String[] args) {
MyString m = new MyString();
MyString ms = new MyString("cddcdc");
MyString ms1 = new MyString("cddcdc");
MyString mt= new MyString("cdc");
System.out.println("位置是:"+ms.indexOf(mt,0));
m.check(ms, ms1);
}
}
3.结果
[c, d, c] 的在主字符串[c, d, d, c, d, c]位置是:3
两字符相等
总结
这里最后我要说的是关于toString()方法重写的问题。在课堂上写的时候,说要判断两字符串是否相等。
一开始我想的是建一个方法含两个形参String,然后再在测试类中调用。结果发现两个参数不是String类型的,而是MyString类对象。
接着我就修改为拿两形式参数的value进行比较,为此还Source了Get和Set方法,结果发现还是不对。拿的是两对象的地址。
最后我就重写的了toString()方法,让其返回的类型可以作比较。