我是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
有小费吗?我不需要解决方案,只是一个提示。
谢谢。
你在这里有范围问题。
列表已在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;
}
正如其他人所提到的,您面临范围问题,因此您需要在循环外声明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]);
您的列表声明位于循环内部,因此在外部不可见。您需要在循环之外移动列表声明
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);
}