错误:找不到符号 - stream()。toArray(String [] :: new);

时间:2018-01-06 08:41:49

标签: java arrays arraylist

我是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

任何提示?我不需要解决方案,只是一个提示。

谢谢。

3 个答案:

答案 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]);