2.27课堂小测

课堂练习01题目:计算最长英语单词链。

一、题目内容:

大家经常玩成语接龙游戏,我们试一试英语的接龙吧:一个文本文件中有N 个不同的英语单词, 我们能否写一个程序,快速找出最长的能首尾相连的英语单词链,每个单词最多只能用一次。

最长的定义是:最多单词数量,和单词中字母的数量无关。

二、题目要求:

1、统一输入文件名称:input1.txt, input2.txt

2、统一输出文件名称:output1.txt,output2.txt

3、程序需要考虑下列异常状况:

(1)例如,文件不存在,你的程序会崩溃么,还是能优雅地退出并给用户提示信息?

(2)如果文件没有任何单词、只有一个单词、没有可以首尾相连的单词,程序应该如何输出?

(3)如果输入文件有一万个单词,你的程序能多快输出结果?

 

项目结构

//shouwei.java 定义了一个结构体和相关文件读取方法

package piao;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class shouwei {
public char start; //单词首字母
public char end; //单词尾字母
public int pos; //单词出现位置
public int sum; //单词是连续的第几个
public String word; //单词
public shouwei() {
}

@Override
public String toString() {
return "shouwei [start=" + start + ", end=" + end + ", pos=" + pos + ", sum=" + sum + ", word=" + word
+ "]";
}

public ArrayList<shouwei> symb(String s) { //将文件的单词分离出 删除符号等影响操作 返回一个list结构体

ArrayList<shouwei> kk=new ArrayList<shouwei>();

File file=new File(s);
StringBuffer end=new StringBuffer();
if(!file.exists()) {
System.out.print("该文件不存在");
System.exit(0);
}
try {
BufferedReader reader=new BufferedReader(new FileReader(file));
String text=null;
while((text=reader.readLine())!=null)
{
end.append(text);
}

} catch (IOException e) {
System.out.println("程序出现问题");
}
StringBuffer result=new StringBuffer();
for(int i=0;i<end.length();i++) {
if(end.charAt(i)>='a'&&end.charAt(i)<='z')
result.append(end.charAt(i));
else if(end.charAt(i)>='A'&&end.charAt(i)<='Z')
result.append(end.charAt(i));
else if(end.charAt(i)==' ')
result.append(end.charAt(i));
else
result.append(" ");

}
int pos1=0;
char start=' ';
char ende;
String word="";
for(int i=1;i<result.length()-1;i++) {
if(result.charAt(i)==' ')
continue;
if(result.charAt(i-1)==' ')
{
word+=result.charAt(i);
start=result.charAt(i);
continue;
}
if(result.charAt(i+1)==' ')
{
shouwei e =new shouwei();
word+=result.charAt(i);
ende=result.charAt(i);
pos1++;
e.start=start;
e.end=ende;
e.pos=pos1;
e.sum=0;
e.word=word;
kk.add(e);
word="";
start=' ';
ende=' ';
continue;
}
if((result.charAt(i)>='a'&&result.charAt(i)<='z')||(result.charAt(i)>='A'&&result.charAt(i)<='Z')) {
word+=result.charAt(i);
}

}
if(kk.size()==0) {
System.out.println("只有一个单词!");
System.exit(0);
}

return kk;

}
public int da(ArrayList<shouwei> kk) {   //返回最大单词链长度
int max=0;
int text=1;
for(int i=0;i<kk.size()-1;i++) {
if(kk.get(i).end==kk.get(i+1).start) {
text++;
kk.get(i).sum=text;
}
else text=1;

max=(max>text)?max:text;
}
return max;
}
public String pos(ArrayList<shouwei> kk) {  //返回最大的单词链
int pos=0;
int max=0;
String s="";
for(int i=0;i<kk.size();i++) {
if(kk.get(i).sum>max) {
max=kk.get(i).sum;
pos=i;
}
}
while(max>0) {
s+=kk.get(pos-max+2).word+" ";
max--;
}
return s;

}
public int position(ArrayList<shouwei> kk) {
int pos=0;
int max=0;
String s="";
for(int i=0;i<kk.size();i++) {
if(kk.get(i).sum>max) {
max=kk.get(i).sum;
pos=i;
}
}
return pos+1;

}

}

 

 

//Piao.java 主函数

package piao;

import java.util.ArrayList;
import java.util.Scanner;


public class Piao {

 

 

 

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.print("请输入文件名:");
String text=sc.next();
ArrayList<shouwei> kk=new shouwei().symb(text);
System.out.println("最大长度是:"+new shouwei().da(kk));
System.out.println("最大单词链为:"+new shouwei().pos(kk));


}

}

posted @ 2023-02-27 20:49  小趴菜且能喝66  阅读(14)  评论(0编辑  收藏  举报