【问题标题】:Enclosing scope must be final with Java Streams封闭范围必须是 Java 流的最终范围
【发布时间】:2020-11-11 04:03:35
【问题描述】:

尝试使用流计算字符串中的字符数时出现错误 “我在封闭范围内定义的局部变量必须是最终的或有效的最终” 在这种情况下,您使用什么作为解决方法?我只需要单独做而不循环吗? 我是一名学生,任务是解密凯撒密码,因此频率分析是其中的一部分。

谢谢。

public static int[] freqAnalyse(String text) {
    int[] frequencies = new int[26];
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    text = text.toUpperCase();
    for(int i = 0; i < 26; i++) {
        frequencies[i] = (int) text.chars().filter(k -> k == alphabet.charAt(i)).count();
    }
    return frequencies;
}

编辑 这行得通,这是不好的做法还是它想要的? 谢谢。

public static int[] freqAnalyse(String text) {
        int[] frequencies = new int[26];
        String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        text = text.toUpperCase();
        for(int i = 0; i < 26; i++) {
            final int j = i;
            frequencies[j] = (int) text.chars().filter(k -> k == alphabet.charAt(j)).count();
        }
        return frequencies;
    }

【问题讨论】:

    标签: java


    【解决方案1】:

    最简单的解决方法是将i复制到一个新变量中。

     final int ii = i;
     frequencies[i] = (int) text.chars().filter(k -> k == alphabet.charAt(ii)).count();
    

    或者,您可以只为该字符存储一个变量:

    final char ch = alphabet.charAt(i);
    frequencies[i] = (int) text.chars().filter(k -> k == ch).count();
    

    【讨论】:

    • 在看到这个之前先解决了它,然后编辑它。谢谢你:)
    【解决方案2】:

    在这些情况下,您也可以使用迭代器完全忽略计数变量i。 这是另一种方法

            int[] frequencies = new int[26];
            String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            text = text.toUpperCase();
            for (char c : alphabet.toCharArray()) {
                frequencies[c-'A'] = (int)text.chars().filter(value -> value == c).count();
            }
    

    只使用一个流线:

        String upperCase = text.toUpperCase();
        alphabet.chars().forEach(ch -> frequencies[ch-'A'] = (int)upperCase.chars().filter(value -> value == ch).count());  
    

    【讨论】:

    • 我不知道为什么我没有想到你的第 1 部分,不过还是喜欢一个班轮。需要更好地使用这样的流。谢谢你:)
    【解决方案3】:

    也许你可以尝试做这样的事情:

    public static int[] freqAnalyse(String text) {
        int[] frequencies = new int[26];
        String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        text = text.toUpperCase();
        for(int i = 0; i < 26; i++) {
            final char c = alphabet.charAt(i);
            frequencies[i] = (int) text.chars().filter(k -> k == c).count();
        }
        return frequencies;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-04
      • 2017-08-28
      • 1970-01-01
      • 2019-10-28
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多