这是我的问题,我必须解释很多,因为它很复杂。
我创建了一个arrayList< Word >,其中包含字符串作为对象。在我的例子中,我有三个类,一起工作,应该代表字典。
第一个类叫做“Word”,它有一个构造函数,并且有简单的方法,如.length,向计数器加1,并跟踪重复的单词。
第二类被称为“Wordlist”,并使用更高级的方法,如读取文件,总结30,000个单词。例如,有些方法是将单词添加到arraylist中作为对象。搜索方法,如果他们可以找到一个特定的单词。现在,这些任务包含参数,包含我可以使用的变量。
但我遇到了一个任务,我必须在arrayList中找到最长的单词(字符串),没有任何参数。该方法称为:public Word findLongest()。
在thrid类中,我有测试用例,我使用的是方法。这里最重要的部分是读取文件,并将其添加到arrayList对象。我可以用什么方法在没有任何参数的情况下使用该方法查找arrayList中最长的单词(字符串)?
将arrayList作为对象非常混乱。
我知道 for(each:array)在这个意义上使用,但不知道如何正确使用它。
答案 0 :(得分:0)
假设您的 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);
}
}
答案 1 :(得分:0)
如果您的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”的List并将当前Word对象存储在名为“word”的变量中。然后你只需检查每个单词的长度,看它是否比已找到的最长单词长。 (如果longestWord
变量是null
,那么这意味着到目前为止你还没有处理任何单词,所以找到的第一个单词将进入该变量,准备好与下一个进行比较。)
注意:如果有多个长度最长的单词,则此方法将返回找到该长度的第一个单词。如果您需要返回所有长度最长的单词列表,则需要修改此模式以生成List<Word>
,其中包含所有长度最长的单词。
答案 2 :(得分:0)
对于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<Word>
。请注意,我们也可以写Word::length
来代替word -> word.length()
。
orElse
“解包”可选值。如果找不到任何内容(例如,因为每个值均为null
或listOfWords
为空),则返回null
。