题目:给出一篇英文文章,给英文单词来个“成语接龙”,输出最长链的单词。
思路:这个题我经过思考觉得是从第一个读入的单词来说进行成语接龙一直到最后。但是我一直认为这个题目可以找出最长的单词链,应该从最长的单词朝找起,但是具体算法我还是没有思考出来,之后我会给予算法。先说第一种有顺序的。我的想法是先将单词从一开始提取出来然后进行查重处理,得到一个单词数组之后从第一个的字符进行判断相同,在进行输入到文件中,若不同则进行下次循环。
这是我的代码其中:
findword.java
package Week15;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Findword {
private String word;
public Findword() {
word="";
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public void input(Findword[] word) {
String str;
try {
BufferedReader in=new BufferedReader(new FileReader("input2.txt"));
while((str = in.readLine())!=null) {
change(str,word);
}
in.close();
}
catch (IOException e) {
System.out.println("缓冲区错误");
}
}
public void output(String[] word) throws IOException {
try {
FileWriter file=new FileWriter("output1.txt");
BufferedWriter in = new BufferedWriter(file);
if(word[0]==null)in.write("输入错误!");
else {
for(int i=0;word[i]!=null;i++) {
in.write(word[i]);
in.newLine();
}
}
in.flush();
in.close();
}
catch (IOException e) {
System.out.println("缓冲区2错误");
}
}
private void change(String str, Findword[] word2) {
char[] s1=str.toCharArray();
String str1=null;
int star=0,end=0;
for(int i=0;i<s1.length;i++) {
if((s1[i]>90&&s1[i]<97)||s1[i]<65||s1[i]>122) {
if(star==0&&end==0) {
star=i;
continue;
}
else {
end=i;
}
if(star==0)continue;
str1=str.substring(star+1,end);
if(star+1==end) {star=end;continue;}
//System.out.println("Str1="+str1+"_");
addword(word2,str1);
star=end;
}
}
}
private void addword(Findword[] word2, String str1) {
int j=0;
boolean f=false;
for(int i=0;i<word2.length;i++) {
if(word2[i].getWord().equals("")) {f=true;j=i;break;}
if(word2[i].getWord().equals(str1)) {break;}
}
if(f==true) {
word2[j]=new Findword();
word2[j].setWord(str1);
}
}
public String[] getarray(Findword[] word){
String [] array=new String[99999];
int num=1;
if(word[0]!=null) {
char[] str=word[0].getWord().toCharArray();
char end=str[str.length-1];
array[0]=word[0].getWord();
for(int i=1;!word[i].getWord().equals("");i++) {
str=word[i].getWord().toCharArray();
if(str[0]==end||str[0]-end==32||end-str[0]==32) {
array[num]=word[i].getWord();
end=str[str.length-1];
num++;
}
else ;
}
}
return array;
}
}
longestChain.java:
package Week15;
import java.io.IOException;
public class LongestChain {
public static void main(String[] args) throws IOException {
Findword[] word2= new Findword[999999];
String [] str=new String [99999];
for(int i=0;i<word2.length;i++) {
word2[i]=new Findword();
}
word2[0].input(word2);
//for(int i=0;!word2[i].getWord().equals("");i++) {
// System.out.println(word2[i].getWord());
//}
str=word2[0].getarray(word2);
//for(int i=0;str[i]!=null;i++) {
// System.out.println(str[i]);
//}
word2[0].output(str);
}
}
这次测试中我体会到了什么叫做及时做笔记将代码封装起来进行相关的调用,这次我的思路很明确一将单词提取出来二将单词连接起来即完成任务。但是我上一次的程序的单词提取出来的程序没有封装起来以及相关的数目加和计算更是乱成一团。值得庆幸的是我今天没有想从原来的代码上进行二次开发二十零写一个更好的代码进行开发。这次我将修改我的程序将我的程序更好的封装起来,以及各个函数的任务更明确。