【问题标题】:Using bufferedreader then convert to a string使用 bufferedreader 然后转换为字符串
【发布时间】:2015-12-16 20:53:52
【问题描述】:

您好,我有这个任务,我真的不明白如何完成。 我已经编写 Java 2.5 周了,所以我真的很新。

我应该将一个文本文档导入我的程序,然后进行这些操作,计算字母、句子和单词的平均长度。我必须逐个字母地执行计数任务,我不允许同时扫描整个文档。我设法导入文本并将其打印出来,但我的问题是我不能使用我的字符串“line”来执行任何这些操作。我尝试将其转换为数组、字符串,并且在多次尝试失败后我放弃了。那么如何将我的输入转换为我可以使用的东西,因为我总是收到错误消息“行不是变量”或类似的东西。 杰斯珀

用我的解决方案更新!还有一些是瑞典语的,对此感到抱歉。

不知为何格式不对,所以我把代码上传到这里,现在真的不想和这个赖特争论了!

http://txs.io/3eIb

【问题讨论】:

  • 我不能用我的字符串“line”来做这些操作 为什么不呢?你有什么问题?向我们展示您遇到问题的代码以及实际错误。 “行不是变量”实际上听起来不像是 Java 错误。
  • 如果您专门针对您的错误提出这个问题,将会有很大帮助。例如,展示最有代表性的失败尝试,准确描述它应该做什么,并提供它创建的确切错误消息。
  • Markspace:我的问题是我无法在任何地方使用字符串行,我尝试了很多方法,但答案总是相同,不知何故找不到行。我没有发布我遇到问题的代码的原因是我尝试了 6 种不同的方法,并不是我使用代码错误,只是它拒绝对 line 做任何事情。
  • TextStatsCollector 需要在它自己的文件中定义,在同一个包中以使事情变得简单。还要确保存在类定义 - 公共类 TextStatsCollector。不过,你的结构现在开始成型了!
  • 我很感激所有的帮助,但我觉得你们中的一些解决方案对于我在编程 java 的地方来说是先进的。我从头开始,解决了一些像你一样的问题,但是有更多的初学者代码,我把它贴在我的问题中,也许你可以给我一些批评!我知道我的许多解决方案都很丑陋,而且代码也不是很好。无论如何感谢您的帮助!在 stackoverflow 上的第一次体验很棒!

标签: java bufferedreader java-io


【解决方案1】:

要计算字母,请检查每个字符。如果是空格或标点符号,请忽略它。否则,它是一个字母,我们应该增加这个值。

每个单词后面都应该有一个空格,除非它是句子的最后一个单词。要获取单词数,请跟踪空格数 + 句子数。要获得句子的数量,请找到! ?和。

我会通过查看 ascii value of each character 来做到这一点。

int numSentences = 0; 
int numWords = 0;
while (line = ...){
   for(int i = 0; i <line.length(); i++){

int curCharAsc = (int)(line.at(i)) //get ascii value by casting char to int 
        if((curCharAsc >= 65 && curCharAsc <= 90) || (curCharAsc >= 97 && curCharAsc <= 122) //check if letter is uppercase or lowercase
              numLetters++;

        if(curCharAsc == 32){ //ascii for space
             numWords++;
         }
          else if (curCharAsc == 33 || curCharAsc == 46 || curCharAsc == 63){
               numWords++;
               numSentences++;
          }
   }
}

double avgWordLength = ((double)(letters))/numWords; //cast to double before dividing to avoid round-off

【讨论】:

  • 如果你用lines的长度相加来计算字母的个数,别忘了减去最后的标点字符(本例中为numWords)。
  • 我稍后会研究,首先我需要能够使用我的 String 行,但它现在不能正常工作!谢谢
【解决方案2】:

您的代码工作正常,它加载一个文件并逐行打印出内容。您可能需要做的是捕获每一行。对于这个 StringBuilder 或 StringBuffer,Java 有两个有用的类(选择一个)。

    BufferedReader input = new BufferedReader(new FileReader(args[0]));
    String line;
    StringBuffer buffer = new StringBuffer();
    while ((line = input.readLine()) != null) {
       System.out.println(line);
       buffer.append(line+" ");

  }
    input.close();
    performOperations(buffer.toString());

唯一的另一种可能性是(如果您自己的代码没有为您运行)- 可能您在运行此类时没有将输入文件名作为参数传递?

更新 注意 - 我已经修改了这一行

     buffer.append(line+"\n");

添加空格而不是换行符,以便与@faraza答案中的算法兼容

performOperations 方法还不存在。所以你应该/可以添加这样的东西

   public static void performOperations(String data){ 

   }

您的方法可以依次调用每个操作的单独方法

  public static void performOperations(String data){ 
         countWords(data);
         countLetters(data); 
         averageWordLength(data);
  }

为了更上一层楼并引入面向对象,您可以创建一个 TextStatsCollector 类。

public class TextStatsCollector{ 

private final String data;

public TextStatsCollector(final  String data) {
    this.data = data;

}
public int countWords(){
    //word count impl here
 }
public int countLetters(){
    //letter count impl here
 }
public int averageWordLength(){
    //average word length impl here
 }

public void performOperations(){

   System.out.println("Number of Words is " +  countWords()); 
   System.out.println("Number of Letters is " +  countLetters()); 
   System.out.println("Average word length is " +  averageWordLength()); 
}

}

然后你可以在你的 main 方法中像下面这样使用 TextStatsCollector

  new TextStatsCollector(buffer.toString()).performOperations();

【讨论】:

  • 我正在努力理解,但它超级难。!在没有您添加的情况下使用我的代码,它会打印出我的文本,这很好。正如你所说我需要捕获它,我不太了解StringBuilder或StringBuffer。我是否必须使用新方法或其他方法,因为它不会编译您的最后一行,performOperations(buffer.toString());。 Eclipse 告诉我“MinTextFil 类型的方法 performOperations(String) 未定义”。我很迷茫,我知道我想做什么,但我不知道怎么做,我想要一个可行的字符串,这样我就可以开始研究单词分析部分了。杰斯珀
  • 我这样解决了,现在我的 line2 打印了与我的文件相同的文本,我可以用它来解决其余的问题,我喜欢你的意思吗?我没有使用您的 performOperations 行。当前代码在问题中。
  • @jespercrimefighter - 最后一行是对一个(尚不存在)的方法的调用,其中 StringBuffer 转换为字符串(文件中的所有数据)。它只是一个实施您的操作的地方。我会更新我的答案。它为您提供了回答的结构,而不是您的作业本身的实施。
  • 感谢您的帮助,我在解决您的解决方案时遇到了很多麻烦,所以我决定重新开始并以初学者的方式进行更多操作,只用了 8 小时左右。我已经在我的问题的链接中发布了代码,因为格式似乎是错误的,我现在不想争论,因为我的头完全是土豆!干杯
猜你喜欢
  • 2017-08-09
  • 2019-10-10
  • 2013-05-17
  • 1970-01-01
  • 2011-05-20
  • 2019-10-16
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多