【问题标题】:Output the longest word in a text file输出文本文件中最长的单词
【发布时间】:2013-02-16 07:51:43
【问题描述】:

我创建了一个文本文件,将每个单词写入 Android 应用程序的 editText 框中。我还尝试使用bufferedreader 读取文件的内容。问题是,我只想输出创建的列表中最长的单词,但我似乎无法比较所有输入的字符串。我的谷歌搜索只提供了有关比较两个字符串长度的信息。如何比较文本文件中每一行的长度?谁能指导我下一步该怎么做?

我的代码如下所示:

 try
   {
        File myFile = new File("/sdcard/logger.file");
        FileInputStream fIn = new FileInputStream(myFile);
        BufferedReader myReader = new BufferedReader(
                new InputStreamReader(fIn));
        String aDataRow = "";
        String aBuffer = "";
        while ((aDataRow = myReader.readLine()) != null)
        {
            aBuffer += aDataRow + "\n";
        }
        show.setText(aBuffer);
        myReader.close();
        Toast.makeText(getBaseContext(),
                "Done reading SD 'mysdfile.txt'",
                Toast.LENGTH_SHORT).show();
        }
   catch (Exception e) 
   {
        Toast.makeText(getBaseContext(), e.getMessage(),
                Toast.LENGTH_SHORT).show();
   }
}

【问题讨论】:

    标签: java android bufferedreader string-length


    【解决方案1】:

    你可以使用 java.util.Scanner,

        try
       {
            File myFile = new File("/sdcard/logger.file");
            Scanner scanner = new Scanner(myFile);
            String bigWord = "";
            while (scanner.hasNextLine()) {
                Scanner wordScanner = new Scanner(scanner.nextLine());
                while (wordScanner.hasNext()) {
                    String str = wordScanner.next();
                    if(str.length() > bigWord.lenght())
                        bigWord = str;
                }
            }
            show.setText(bigWord);
            Toast.makeText(getBaseContext(),
                    "Done reading SD 'mysdfile.txt'",
                    Toast.LENGTH_SHORT).show();
       }
       catch (Exception e) 
       {
            Toast.makeText(getBaseContext(), e.getMessage(),
                    Toast.LENGTH_SHORT).show();
       }
    }
    

    【讨论】:

      【解决方案2】:

      我不知道你的文本文件是什么样的,但如果你每行只有一个单词,你可以使用两个字符串的比较。事实上,您在从文件中读取每个单词/行时已经“触摸”了它,为什么不直接比较它们呢?我修改了你的代码,所以它应该做你想做的事。

      try
      {
          File myFile = new File("/sdcard/logger.file");
          FileInputStream fIn = new FileInputStream(myFile);
          BufferedReader myReader = new BufferedReader(
                  new InputStreamReader(fIn));
          String longestString ="";
          String aDataRow = "";
          String aBuffer = "";
          while ((aDataRow = myReader.readLine()) != null)
          {
              if(longestString.length()<=aDataRow.length()){
                  longestString = aDataRow;
              }
              aBuffer += aDataRow + "\n";
          }
          //So here you defenitly got your longestWord in "longestString"
          show.setText(aBuffer);
          myReader.close();
          Toast.makeText(getBaseContext(),
                  "Done reading SD 'mysdfile.txt'",
                  Toast.LENGTH_SHORT).show();
          }
      catch (Exception e) 
      {
          Toast.makeText(getBaseContext(), e.getMessage(),
                  Toast.LENGTH_SHORT).show();
      }
      

      【讨论】:

      • 感谢您的帮助..您是对的,我的文本文件每行只包含一个单词。 =)
      【解决方案3】:

      解决此问题的一种易于理解的方法是将其分为两个步骤。

      第一步是将所有单独的单词读入一个大数组或列表中。 第二步是遍历数组或列表,找到最长的单词。 我不确定您是要获得最长的行还是最长的单词。也许他们是一样的。

      无论如何,针对您的具体问题,您需要:

      列表行 = new ArrayList();

      那你需要替换 aBuffer += aDataRow + "\n";用这个:lines.add(aDataRow);

      然后当你读完文件后,你只需要这样的代码:

      int biggest = 0;
      String big_word = "";
      for (String row : lines) {
          if (row.length() > biggest) {
              biggest = row.length();
              big_word = row;
          }
      }
      
      Toast.makeText(getBaseContext(), "Biggest word is " + big_word, Toast.LENGTH_SHORT).show();
      

      人们会认识到可以将列表的创建和文件的读取结合起来,但是这种方法更容易理解。

      【讨论】:

      • 非常感谢,您的回答很有帮助!萨拉马特! =)
      • 快乐编程@chArm :)
      【解决方案4】:

      Guava解决方案:

          String longestWord = Files.readLines(new File("/sdcard/logger.file"), Charsets.UTF_8, 
              new LineProcessor<String>() {
      
                  TreeSet<String> set = new TreeSet(new Comparator<String>() {
                      @Override public int compare(String o1, String o2) {
                          return o1.length() - o2.length();
                      }
                  });
      
               @Override public boolean processLine(String line) {
                   set.addAll(Sets.newHashSet(Splitter.on(" ").split(line)));
                   return true;
               }
      
               @Override public String getResult() {
                  return set.last();
               }
          });
      

      【讨论】:

        猜你喜欢
        • 2013-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-31
        • 2017-01-10
        • 1970-01-01
        相关资源
        最近更新 更多