我是Java的新手,我练习了: 给定一个字符串数组,返回另一个包含所有最长字符串的数组。
所以我写了代码:
String[] allLongestStrings(String[] inputArray) {
int longest = 0;
for (int i = 0; i < inputArray.length; i++)
{
if (inputArray[i].length() > longest)
{
longest = inputArray[i].length();
}
ArrayList<String> list = new ArrayList<String>();
for(int j = 0; j < inputArray.length; j++)
{
String word = inputArray[i];
if(word.length() == longest) list.add(word);
}
}
String[] strings = list.stream().toArray(String[]::new);
return strings; }
但我发现错误:
file.java on line 20: error: cannot find symbol
String[] strings = list.stream().toArray(String[]::new);
^ symbol: variable list location: class _runzzmqt 1 error
任何提示?我不需要解决方案,只是一个提示。
谢谢。
答案 0 :(得分:1)
这里有范围问题。
列表已在for循环中声明,并且您正尝试在外部访问它。
请记住,范围仅限于阻止({}
)。如果你缩进代码,你可以很容易地看到
for (int i = 0; i < inputArray.length; i++) {
if (inputArray[i].length() > longest) {
longest = inputArray[i].length();
}
ArrayList<String> list = new ArrayList<String>();
for (int j = 0; j < inputArray.length; j++) {
String word = inputArray[i];
if (word.length() == longest)
list.add(word);
}
}
String[] strings = list.stream().toArray(String[]::new);
只需将其移至顶部即可访问它。
String[] allLongestStrings(String[] inputArray) {
int longest = 0;
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < inputArray.length; i++) {
if (inputArray[i].length() > longest) {
longest = inputArray[i].length();
}
for (int j = 0; j < inputArray.length; j++) {
String word = inputArray[i];
if (word.length() == longest)
list.add(word);
}
}
String[] strings = list.stream().toArray(String[]::new);
return strings;
}
答案 1 :(得分:0)
您的列表声明位于循环内部,因此在外部不可见。您需要在循环之外移动列表声明
String[] allLongestStrings(String[] inputArray) {
int longest = 0;
List<String> list = new ArrayList<String>();
for (int i = 0; i < inputArray.length; i++) {
if (inputArray[i].length() > longest) {
longest = inputArray[i].length();
}
for (int j = 0; j < inputArray.length; j++) {
list.clean();// if there is longer String, remove previous results
String word = inputArray[i];
if (word.length() == longest)
list.add(word);
}
}
String[] strings = list.stream().toArray(String[]::new);
return strings;
}
您还可以使用Stream API来支付更高的费用:
String[] allLongestStrings(String[] inputArray) {
int longest = Arrays.stream(inputArray)
.map(String::length)
.max(Integer::compareTo).orElse(0);
return Arrays.stream(inputArray)
.filter( v-> v.length() == longest)
.toArray(String[]::new);
}
答案 2 :(得分:0)
正如其他人所说,您面临 范围 问题,因此您需要在循环外声明ArrayList
。
然而,还有另一个问题;所以为了找到特定大小的所有最长字符串,你需要将嵌套循环删除到两个独立的循环中,如下所示:
String[] allLongestStrings(String[] inputArray) {
int longest = 0;
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < inputArray.length; i++)
{
if (inputArray[i].length() > longest)
{
longest = inputArray[i].length();
}
}
for(int j = 0; j < inputArray.length; j++)
{
String word = inputArray[j];
if(word.length() == longest) list.add(word);
}
String[] strings = list.toArray(new String[0]);
return strings;
}
这是必要的,因为您在帖子中显示的代码不是迭代整个数组,以便在与元素进行比较之前找到最长的字符串,从而导致错误的结果。
此外,无需从列表中创建Stream
以将其转换为数组,只需执行list.toArray(new String[0]);