【问题标题】:How to find the longest string object in an arrayList如何在arrayList中找到最长的字符串对象
【发布时间】:2017-02-25 17:24:36
【问题描述】:

这是我的问题,我必须解释很多,因为它很复杂。

我创建了一个 arrayListWord>,其中包含字符串作为对象。在我的例子中,我有三个类,它们一起工作,应该代表一个字典。

第一个类叫做“Word”,它有一个构造函数,并且有像.length这样的简单方法,计数器加1,并跟踪重复的单词。

第二类叫做“Wordlist”,使用更高级的方法,比如阅读文件,30,000字的摘要。例如,一些方法是将单词作为对象添加到数组列表中。如果他们能找到一个特定的词,像搜索这样的方法。现在,这些任务包含参数,以及我可以使用的变量。

但是我遇到了一项任务,我必须在没有任何参数的情况下在 arrayList 中找到最长的单词(字符串)。该方法被调用:public Word findLongest().

在第三类中,我有测试用例,我在其中使用方法。这里最核心的部分是读取文件,并将其添加到 arrayList 对象。在没有任何参数的情况下,如何使用该方法在arrayList中找到最长的单词(字符串)?

将arrayList作为对象非常令人困惑。

我知道 for (each : array) 在这个意义上的使用,但不知道如何正确使用它。

【问题讨论】:

  • 您能分享一下您已有的代码吗?

标签: java string object arraylist


【解决方案1】:

如果您的 Word 类提供了一个 length() 方法,该方法仅返回该对象表示的单词的长度,那么您可以遍历您的 ArrayList<Word> 并找到最长的,如下所示:

private Word getLongestWordFromList(List<Word> listOfWords) {
    Word longestWord = null;
    for (Word word : listOfWords) {
        if (longestWord == null || word.length() > longestWord.length()) {
            longestWord = word;
        }
    }
    return longestWord;
}

for (Word word : listOfWords) 模式简单地说:遍历名为“listOfWords”的列表并将当前 Word 对象存储在名为“word”的变量中。然后你只需检查每个单词的长度,看看它是否比已经找到的最长的更长。 (如果 longestWord 变量是 null 则意味着您到目前为止还没有处理任何单词,所以无论找到的第一个单词是什么都将进入该变量,准备与下一个进行比较。)

注意:如果有多个单词的长度最长,那么此方法将简单地返回找到的第一个具有该长度的单词。如果您需要返回所有长度最长的单词的列表,那么您需要修改此模式以生成包含所有最长长度单词的List&lt;Word&gt;。

【讨论】:

    【解决方案2】:

    假设你的 Word 类有一个名为 length() 的方法,可能是这样的:

    Word longest = arrayList.get(0);
    for (int i=1; i<arrayList.size(); ++i) {
       if (arrayList.get(i).length() > longest.length()) {
          longest = arrayList.get(i);
       }
    }
    

    【讨论】:

      【解决方案3】:

      对于 Java Stream 爱好者来说,一种非常声明式的解决方案是:

      private Word getLongestWordFromList(List<Word> listOfWords) {
      
          return listOfWords.stream()
              .filter(word -> word != null)
              .max(Comparator.comparing(Word::length))
              .orElse(null);
      
      }
      

      filter 确保流跳过空值。

      max 比较字长并返回具有最大长度值的Optional&lt;Word&gt;。请注意,我们也可以写成word -&gt; word.length(),而不是Word::length。

      orElse“解包”可选值。如果它没有找到任何东西(例如,因为每个值都是 null 或 listOfWords 为空),它返回 null。

      【讨论】:

        猜你喜欢
        • 2012-09-14
        • 1970-01-01
        • 2015-11-25
        • 1970-01-01
        • 2018-06-13
        • 1970-01-01
        • 1970-01-01
        • 2017-05-30
        • 1970-01-01
        相关资源
        最近更新 更多