Educoder–Java面向对象(第四章)- String类【笔记+参考代码】

Educoder–Java面向对象(第四章)- String类【笔记+参考代码】

第一关

编程要求

本关的编程任务是补全右侧代码片段中Begin至End中间的代码,具体要求如下:

roster1变量为之前的全班花名册,roster2变量为小明统计的全班花名册。 你将被要求输出3行:

第一行为roster1的长度;

第二行为roster2的长度;

第三行为两个花名册是否相同,若相同,输出“相同”;反之输出“不相同”(若姓名顺序不同,也算作不相同)。

评测说明 平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是测试样例:


测试输入:

张三 李四 王五 小明

李明 张三 小明 王五


预期输出:

11

11

不相同

参考代码

package step1;

import java.util.Scanner;

public class Roster {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        /********** Begin *********/
		String s1=scanner.nextLine();
		String s2=scanner.nextLine();
		System.out.println(s1.length());
		System.out.println(s2.length());
		int a=s1.compareTo(s2);
		if(a!=0)
			System.out.println("不相同");
		else
			System.out.println("相同");
        /********** End *********/
    }
}

此关主要考察对字符串的读入以及compareTo函数的应用。



第二关

编程要求
本关的编程任务是补全右侧代码片段中Begin至End中间的代码,具体要求如下:

data变量为乱码文件的文本数据,由命令行读入;

name变量为需要查找的姓名,由命令行读入;

你将被要求输出若干行,每一行为查找到的姓名的位置。

评测说明 平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。
以下是测试样例:


测试输入:

我嗨李四各位哦给李四复位后发我肥沃李四放我访问后李樊红伟四分嚄嚄嚄范围李四佛为红包蓝色配个好玩李四

李四


预期输出:

2

8

17

35

47

package step2;

import java.util.Scanner;

public class NameSearch {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        /********** Begin *********/
		String data=scanner.nextLine();
		String name=scanner.nextLine();
		int i=0,a=0;
		while(i<=data.length()){
			a=data.indexOf(name,i);
			if(a!=-1){
				System.out.println(a);
				i=a+1;
			}
			else
				i++;
		}
        /********** End *********/
    }
}


indexOf() 方法有以下四种形式:

  • public int indexOf(int ch): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
  • public int indexOf(int ch, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
  • int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
  • int indexOf(String str, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。

第三关

编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

判断输入的Java文件名是否正确,判断邮箱格式是否正确。其中:合法的文件名应该以 .java 结尾;合法的邮箱名中至少要包含 @ , 并要求@ 在 . 之前。 测试说明 文件名(fileName)和邮箱(email)会作为函数的参数传入。


输入:

HelloWorld.java [email protected]

输出:

Java文件名正确

邮箱名正确


输入:

.java

123456@qq.@com

输出:

Java文件名无效

邮箱名无效

参考代码

package step3;

public class HelloWorld {

	public void judge(String fileName,String email){
	//请在此添加实现代码
	/********** Begin **********/
	if(fileName.lastIndexOf(".")==-1)
		System.out.println("Java文件名无效");
	else{
		String s=fileName.substring(fileName.lastIndexOf("."),fileName.length());
		if(fileName.equals(".java")||(s.equals(".java")==false))
			System.out.println("Java文件名无效");
		else
			System.out.println("Java文件名正确");
	}
	int a=email.indexOf('@'),b=email.indexOf('.');

	if(a!=-1&&b!=-1&&email.lastIndexOf('@')<email.indexOf('.'))
		System.out.println("邮箱名正确");
	else
		System.out.println("邮箱名无效");
	}
}



第四关

编程要求
本关的编程任务是补全右侧代码片段中Begin至End中间的代码,具体要求如下:

data变量为需要进行反转的文本;

ans变量为反转后的文本。

评测说明 平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是测试样例:


测试输入:

oT eb ro ton ot eb


预期输出:

To be or not to be


参考代码

package step4;

public class Reverse {
    public static StringBuffer start(String data) {
        StringBuffer ans = new StringBuffer("");
        /********** Begin *********/
		String[] strs =data.split(" ");
		for(int i=0;i<strs.length;i++){
        	StringBuffer bns = new StringBuffer(strs[i]);
			ans.append(bns.reverse());
			ans.append(" ");
		}
        /********** End *********/
        return ans;
    }
}

split函数的用法:https://blog.csdn.net/shenzhenNBA/article/details/8086110

String与StringBuffer的区别
StringBuffer的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。
String:在String类中没有用来改变已有字符串中的某个字符的方法,由于不能改变一个java字符串中的某个单独字符,所以在JDK文档中称String类的对象是不可改变的。然而,不可改变的字符串具有一个很大的优点:编译器可以把字符串设为共享的。
StringBuffer:StringBuffer类属于一种辅助类,可预先分配指定长度的内存块建立一个字符串缓冲区。这样使用StringBuffer类的append方法追加字符比String使用 + 操作符添加字符到一个已经存在的字符串后面有效率得多。因为使用 + 操作符每一次将字符添加到一个字符串中去时,字符串对象都需要寻找一个新的内存空间来容纳更大的字符串,这无凝是一个非常消耗时间的操作。添加多个字符也就意味着要一次又一次的对字符串重新分配内存。使用StringBuffer类就避免了这个问题。
StringBuffer是线程安全的,在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。
StringBuffer的常用方法
StringBuffer类中的方法要偏重于对字符串的变化例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。
1、append方法
public StringBuffer append(boolean b)
该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer对象的内容也发生改变,例如:
StringBuffer b = new StringBuffer(“abc”);
sb.append(“true”);
则对象b的值将变成”abctrue”。
2、deleteCharAt方法
public StringBuffer deleteCharAt(int index)
该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。例如:
StringBuffer b = new StringBuffer(“Test”);
b. deleteCharAt(1);
该代码的作用删除字符串对象sb中索引值为1的字符,也就是删除第二个字符,剩余的内容组成一个新的字符串。所以对象b的值变为”Tst”。
还存在一个功能类似的delete方法:
public StringBuffer delete(int start,int end)
该方法的作用是删除指定区间以内的所有字符,包含start,不包含end索引值的区间。例如:
StringBuffer b = new StringBuffer(“TestString”);
b. delete (1,4);
该代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串。则对象b的值是”TString”。
3、insert方法
public StringBuffer insert(int offset, String s)
该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:
StringBuffer b = new StringBuffer(“TestString”);
b.insert(4,“false”);
该示例代码的作用是在对象b的索引值4的位置插入字符串false,形成新的字符串,则执行以后对象b的值是”TestfalseString”。
4、reverse方法
public StringBuffer reverse()
该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:
StringBuffer b = new StringBuffer(“abc”);
b.reverse();
经过反转以后,对象b中的内容将变为”cba”。
5、setCharAt方法
public void setCharAt(int index, char ch)
该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:
StringBuffer b = new StringBuffer(“abc”);
b.setCharAt(1,’D’);
则对象b的值将变成”aDc”。
6、trimToSize方法
public void trimToSize()
该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。
7、构造方法:
StringBuffer s0=new StringBuffer();分配了长16字节的字符缓冲区
StringBuffer s1=new StringBuffer(512);分配了512字节的字符缓冲区
8、获取字符串的长度: length()
StringBuffer s = new StringBuffer(“www”);
int i=s.length();
m.返回字符串的一部分值
substring(int start) //返回从start下标开始以后的字符串
substring(int start,int end) //返回从start到 end-1字符串
9.替换字符串
replace(int start,int end,String str)
s.replace(0,1,“qqq”);
10.转换为不变字符串:toString()

你可能感兴趣的:(Educoder–Java面向对象(第四章)- String类【笔记+参考代码】)