标签:从零开始 文件中 一个 数据转换 第一个 cli 可能性 bst line
针对邹欣老师在我博客园随笔中提出的问题(博客园链接https://www.cnblogs.com/cuijunfeng/p/10988873.html),上次在评论里的解释有些词不达意,因此我专门写了一篇博客,首先是我对题意理解有误
我博客园里的代码只是考虑到输入文件是问题中所给出的(Apple,Zoo,Elephant,Under,Fox,Dog,Moon,Leaf,Tree)这是一种十分理想化的文件,也就是说我的代码是从文件的第一个单词开始去寻找
与他首尾相连的单词,而题目中让使用的文件也正好符合apple elephant tree ,这让我认为这段代码是正确的,其实只是运气好,如果最长的字符串的首元素不是文件的首字母,就会出现错误,下面是我对博客园里代码的注释
核心代码说明:
BufferedReader br = new BufferedReader(new FileReader(s))
//创建字符缓冲输入流对象br
StringBuffer sb = new StringBuffer()
//实例化StringBuffer类sb
String text = null
//设置一个空字符串text
while ((text = br.readLine()) != null) {
sb.append(text);
}
//读取流数据,返回字符串。append()是往动态字符串数组后添加,就是x +y + z
br.close();
String str = sb.toString().toLowerCase()
//将读到的数据转换为字符串,并且转换小写
String[] words = str.split("[^(a-zA-Z)]+")
//将上一步处理过的数据写入一个下标从零开始的words数组
StringBuffer yao = new StringBuffer()
//实例一个yao
String b1=words[0]
//将words数组的第一个赋值给字符串b1
yao.append(b1)
//输出b1
yao.append(" ")
String end=b1.substring(b1.length()-1,b1.length())
//substring()方法可以将里面的两个长度中间间隔的字符传入字符串end
//打个比方说一个apple的长度substring(5-1,5),该方法会将apple中第四到第五位的字符输出,也就是末尾项e
for(int i=1;i<words.length;i++)
//一个循环,将循环体从words[1]开始
String start=words[i].substring(0,1)
//将第二个数据,也就是words[1],使用一次substring()方法,此时将单词的首字母传入了start
if(end.equals(start))
{
end=words[i].substring(words[i].length()-1,words[i].length());
//用equals()方法判断是否字母首尾一致,若一致就将end再置为一个连接后的末尾字母,再用循环去找下一个首字母一样的单词
yao.append(words[i]);
//输出找到的可以连接的单词
yao.append(" ");
}
也就是说,这段代码确实能找到一条最长的字符串,只不过只是在题目的特例下,但是核心的代码思想是没有问题的。
解决方法________如果想确定找到的字符串是最长的,并且没有比他更长的字符串
我们可以在String b1=words[0]//将words数组的第一个赋值给字符串b1 这段代码的位置加入的一个for循环,将文件中读取到每一个单词都进行一次赋值循环,这样就可以得到全部的有可能
是最长的字符串,然后再将这些得到的待考量的字符串传入一个新的字符串数组去,最后用一个for循环对数据的.length进行比较,将最长的输出到文件中,这样一来输出的字符串必定是最大的。
上次回复评论时确实没有考虑到这点问题,当时在eclipse中运行后得到的文件中的字符串和题目给出的标准完全一致,所以就忽视了代码中的问题,以至于回复的驴唇不对马嘴,这次您的评论确实
让我深感惭愧,我以后在代码方面一定认真细心,不能囫囵吞枣,必须把借鉴来的东西吃透了,为自己所用,还有就是审题一定要全面,得到正确答案但并不一定是正确的运行过程,要多方面考虑真实
存在的可能性。
标签:从零开始 文件中 一个 数据转换 第一个 cli 可能性 bst line
原文地址:https://www.cnblogs.com/cuijunfeng/p/11020565.html