java字符串深入探索.docx
《java字符串深入探索.docx》由会员分享,可在线阅读,更多相关《java字符串深入探索.docx(15页珍藏版)》请在冰豆网上搜索。
![java字符串深入探索.docx](https://file1.bdocx.com/fileroot1/2023-2/5/06e32745-01a8-403a-8df3-fb381db3f9c9/06e32745-01a8-403a-8df3-fb381db3f9c91.gif)
java字符串深入探索
1键盘录入信息,总分高低排列
Student.java
packagecn.itcast_06;
publicclassStudent{
//姓名
privateStringname;
//语文成绩
privateintchinese;
//数学成绩
privateintmath;
//英语成绩
privateintenglish;
publicStudent(){
super();
}
publicStudent(Stringname,intchinese,intmath,intenglish){
super();
this.name=name;
this.chinese=chinese;
this.math=math;
this.english=english;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetChinese(){
returnchinese;
}
publicvoidsetChinese(intchinese){
this.chinese=chinese;
}
publicintgetMath(){
returnmath;
}
publicvoidsetMath(intmath){
this.math=math;
}
publicintgetEnglish(){
returnenglish;
}
publicvoidsetEnglish(intenglish){
this.english=english;
}
publicintgetSum(){
returnthis.chinese+this.math+this.english;
}
}
StudentDemo.java
packagecn.itcast_06;
importjava.io.BufferedWriter;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.util.Comparator;
importjava.util.Scanner;
importjava.util.TreeSet;
/*
*键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低存入文本文件
*
*分析:
*A:
创建学生类
*B:
创建集合对象
*TreeSet
*C:
键盘录入学生信息存储到集合
*D:
遍历集合,把数据写到文本文件
*/
publicclassStudentDemo{
publicstaticvoidmain(String[]args)throwsIOException{
//创建集合对象
TreeSetts=newTreeSet(newComparator(){
@Override
publicintcompare(Students1,Students2){
intnum=s2.getSum()-s1.getSum();
intnum2=num==0?
s1.getChinese()-s2.getChinese():
num;
intnum3=num2==0?
s1.getMath()-s2.getMath():
num2;
intnum4=num3==0?
s1.getEnglish()-s2.getEnglish():
num3;
intnum5=num4==0?
s1.getName().compareTo(s2.getName())
:
num4;
returnnum5;
}
});
//键盘录入学生信息存储到集合
for(intx=1;x<=5;x++){
Scannersc=newScanner(System.in);
System.out.println("请录入第"+x+"个的学习信息");
System.out.println("姓名:
");
Stringname=sc.nextLine();
System.out.println("语文成绩:
");
intchinese=sc.nextInt();
System.out.println("数学成绩:
");
intmath=sc.nextInt();
System.out.println("英语成绩:
");
intenglish=sc.nextInt();
//创建学生对象
Students=newStudent();
s.setName(name);
s.setChinese(chinese);
s.setMath(math);
s.setEnglish(english);
//把学生信息添加到集合
ts.add(s);
}
//遍历集合,把数据写到文本文件
BufferedWriterbw=newBufferedWriter(newFileWriter("students.txt"));
bw.write("学生信息如下:
");
bw.newLine();
bw.flush();
bw.write("姓名,语文成绩,数学成绩,英语成绩");
bw.newLine();
bw.flush();
for(Students:
ts){
StringBuildersb=newStringBuilder();
sb.append(s.getName()).append(",").append(s.getChinese())
.append(",").append(s.getMath()).append(",")
.append(s.getEnglish());
bw.write(sb.toString());
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
System.out.println("学习信息存储完毕");
}
}
2数据排序
packagecn.itcast_07;
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.FileReader;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.util.Arrays;
/*
*已知s.txt文件中有这样的一个字符串:
“hcexfgijkamdnoqrzstuvwybpl”
*请编写程序读取数据内容,把数据排序后写入ss.txt中。
*
*分析:
*A:
把s.txt这个文件给做出来
*B:
读取该文件的内容,存储到一个字符串中
*C:
把字符串转换为字符数组
*D:
对字符数组进行排序
*E:
把排序后的字符数组转换为字符串
*F:
把字符串再次写入ss.txt中
*/
publicclassStringDemo{
publicstaticvoidmain(String[]args)throwsIOException{
//读取该文件的内容,存储到一个字符串中
BufferedReaderbr=newBufferedReader(newFileReader("s.txt"));
Stringline=br.readLine();
br.close();
//把字符串转换为字符数组
char[]chs=line.toCharArray();
//对字符数组进行排序
Arrays.sort(chs);
//把排序后的字符数组转换为字符串
Strings=newString(chs);
//把字符串再次写入ss.txt中
BufferedWriterbw=newBufferedWriter(newFileWriter("ss.txt"));
bw.write(s);
bw.newLine();
bw.flush();
bw.close();
}
}
3MyBufferReader的功能
MyBufferReader.java
packagecn.itcast_08;
importjava.io.IOException;
importjava.io.Reader;
/*
*用Reader模拟BufferedReader的readLine()功能
*
*readLine():
一次读取一行,根据换行符判断是否结束,只返回内容,不返回换行符
*/
publicclassMyBufferedReader{
privateReaderr;
publicMyBufferedReader(Readerr){
this.r=r;
}
/*
*思考:
写一个方法,返回值是一个字符串。
*/
publicStringreadLine()throwsIOException{
/*
*我要返回一个字符串,我该怎么办呢?
我们必须去看看r对象能够读取什么东西呢?
两个读取方法,一次读取一个字符或者一次读取一个字符数组
*那么,我们要返回一个字符串,用哪个方法比较好呢?
我们很容易想到字符数组比较好,但是问题来了,就是这个数组的长度是多长呢?
*根本就没有办法定义数组的长度,你定义多长都不合适。
所以,只能选择一次读取一个字符。
*但是呢,这种方式的时候,我们再读取下一个字符的时候,上一个字符就丢失了所以,我们又应该定义一个临时存储空间把读取过的字符给存储起来。
*这个用谁比较和是呢?
数组,集合,字符串缓冲区三个可供选择。
*经过简单的分析,最终选择使用字符串缓冲区对象。
并且使用的是StringBuilder
*/
StringBuildersb=newStringBuilder();
//做这个读取最麻烦的是判断结束,但是在结束之前应该是一直读取,直到-1
/*
hello
world
java
104101108108111
119111114108100
1069711897
*/
intch=0;
while((ch=r.read())!
=-1){//104,101,108,108,111
if(ch=='\r'){
continue;
}
if(ch=='\n'){
returnsb.toString();//hello
}else{
sb.append((char)ch);//hello
}
}
//为了防止数据丢失,判断sb的长度不能大于0
if(sb.length()>0){
returnsb.toString();
}
returnnull;
}
/*
*先写一个关闭方法
*/
publicvoidclose()throwsIOException{
this.r.close();
}
}
MyBufferReaderDemo.java
packagecn.itcast_08;
importjava.io.FileReader;
importjava.io.IOException;
/*
*测试MyBufferedReader的时候,你就把它当作BufferedReader一样的使用
*/
publicclassMyBufferedReaderDemo{
publicstaticvoidmain(String[]args)throwsIOException{
MyBufferedReadermbr=newMyBufferedReader(newFileReader("my.txt"));
Stringline=null;
while((line=mbr.readLine())!
=null){
System.out.println(line);
}
mbr.close();
//System.out.println('\r'+0);//13
//System.out.println('\n'+0);//10
}
}
4FileReader功能
LineNumberReader.java
packagecn.itcast_09;
importjava.io.FileReader;
importjava.io.IOException;
importjava.io.LineNumberReader;
/*
*BufferedReader
*|--LineNumberReader
*publicintgetLineNumber()获得当前行号。
*publicvoidsetLineNumber(intlineNumber)
*/
publicclassLineNumberReaderDemo{
publicstaticvoidmain(String[]args)throwsIOException{
LineNumberReaderlnr=newLineNumberReader(newFileReader("my.txt"));
//从10开始才比较好
//lnr.setLineNumber(10);
//System.out.println(lnr.getLineNumber());
//System.out.println(lnr.getLineNumber());
//System.out.println(lnr.getLineNumber());
Stringline=null;
while((line=lnr.readLine())!
=null){
System.out.println(lnr.getLineNumber()+":
"+line);
}
lnr.close();
}
}
MyLineNumberReader.java
packagecn.itcast_09;
importjava.io.IOException;
importjava.io.Reader;
publicclassMyLineNumberReader{
privateReaderr;
privateintlineNumber=0;
publicMyLineNumberReader(Readerr){
this.r=r;
}
publicintgetLineNumber(){
//lineNumber++;
returnlineNumber;
}
publicvoidsetLineNumber(intlineNumber){
this.lineNumber=lineNumber;
}
publicStringreadLine()throwsIOException{
lineNumber++;
StringBuildersb=newStringBuilder();
intch=0;
while((ch=r.read())!
=-1){
if(ch=='\r'){
continue;
}
if(ch=='\n'){
returnsb.toString();
}else{
sb.append((char)ch);
}
}
if(sb.length()>0){
returnsb.toString();
}
returnnull;
}
publicvoidclose()throwsIOException{
this.r.close();
}
}
MyLineNumberReader.java
packagecn.itcast_09;
importjava.io.IOException;
importjava.io.Reader;
importcn.itcast_08.MyBufferedReader;
publicclassMyLineNumberReader2extendsMyBufferedReader{
privateReaderr;
privateintlineNumber=0;
publicMyLineNumberReader2(Readerr){
super(r);
}
publicintgetLineNumber(){
returnlineNumber;
}
publicvoidsetLineNumber(intlineNumber){
this.lineNumber=lineNumber;
}
@Override
publicStringreadLine()throwsIOException{
lineNumber++;
returnsuper.readLine();
}
}
MyLineNumberReaderDemo.java
packagecn.itcast_09;
importjava.io.FileReader;
importjava.io.IOException;
publicclassMyLineNumberReaderTest{
publicstaticvoidmain(String[]args)throwsIOException{
//MyLineNumberReadermlnr=newMyLineNumberReader(newFileReader(
//"my.txt"));
MyLineNumberReader2mlnr=newMyLineNumberReader2(newFileReader(
"my.txt"));
//mlnr.setLineNumber(10);
//System.out.println(mlnr.getLineNumber());
//System.out.println(mlnr.getLineNumber());
//System.out.println(mlnr.getLineNumber());
Stringline=null;
while((line=mlnr.readLine())!
=null){
System.out.println(mlnr.getLineNumber()+":
"+line);
}
mlnr.close();
}
}