(1)设计思路:定义几个数组:
1单词数组,用来存放所有的单词
2长度数组:用来存放从每一个单词开始,单词链的长度
3结果数组:用来存放从每一个单词开始的单词链
用每一个单词查询单词链,并用以上数组保存结果,再从长度数组中提取最大数的下标,输出结果数组该下标对应的字符串即可。
(2)程序源代码:
package fileread;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.OutputStream;
public class text15 {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
BufferedReader reader = new BufferedReader(new FileReader("C:\text.txt"));
StringBuffer string = new StringBuffer();//利用可追加可修改的StringBuffer类对象来储存全部的内容
String line =null;
while ((line=reader.readLine())!= null){
string.append(line);
}
String str = string.toString().toLowerCase(); // 将stringBuffer转为字符并转换为小写
String[] words = str.split("[^(a-zA-Z)]+"); //正则表达式分为单词数组
int further;//之前检测的单词对应的下标
int [] length = new int [words.length];//保存长度的数组
String [] result = new String [words.length];//结果 数组
for(int i=0;i<length.length;i++){
length[i] = 1;
}
for(int i=0;i<words.length;i++){
result[i] = words[i] + " ";
further = i;//将第一个检测的单词的下标赋值给further,继续向下检测
for(int j=i+1;j<words.length;j++){
if(words[further].charAt(words[further].length()-1)==words[j].charAt(0)){
result[i] = result[i] + words[j] + " ";//结果集加上当前单词
length[i]++;//长度加一
further=j;//当前检测的变为之前的
}
}
}
//找到长度数组中
int maxlength = 0;//记录长度数组中的最大值
int maxnum = 0;//记录长度数组中最大数对应的下标,也就是从第几个单词开始的长度对长
for(int i=0;i<length.length;i++){
if(length[i]>maxlength){
maxlength = length[i];
maxnum = i;
}
}
//此时,result[maxnum]即为要输出的内容
if(maxnum==1){
System.out.println("没有首尾连接的单词");
}else{
File file = new File("C:\result.txt");
//用FileOutputSteam包装文件,并设置文件可追加
OutputStream out = new FileOutputStream(file,true);
out.write(result[maxnum].getBytes()); //向文件中写入数据
reader.close();
out.close();
}
}catch (Exception e)
{
e.printStackTrace();
}
}
}
(3)运行结果:
text.txt文件(《飘》的第一章):
result.txt文件:
(4)总结:因为在代码中用到了双重循环,会使代码运行时间大大加长,我还没有找到用一层循环就可以得到结果的方法。