繁体   English   中英

使用哈希图比较两个字谜时出现编译错误

[英]Compilation error when comparing two anagrams while using a hashmap

我必须找到一种方法来检查两个字符串是否是字谜。 如果是,则该方法应返回 true 和 false 否则。 由于我无法想出一个正确的方法来自己做,我发现了 Rodney Shaghoulian 的另一段代码(Github:github.com/RodneyShag,HackerRank:hackerrank.com/RodneyShag)应该可以工作:

import java.io.*;
import java.util.*;

public class Solution {

    static boolean isAnagram(String a, String b) {
        if (a == null || b == null || a.length() != b.length()) {
            return false;
        }
        a = a.toLowerCase();
        b = b.toLowerCase();
        HashMap<Character, Integer> map = new HashMap<>();

        /* Fill HashMap with 1st String */
        for (int i = 0; i < a.length(); i++) {
            char ch = a.charAt(i);
            map.merge(ch, 1, Integer::sum);
        }

        /* Compare 2nd String to 1st String's HashMap */
        for (int i = 0; i < b.length(); i++) {
            char ch = b.charAt(i);
            if (map.containsKey(ch) && map.get(ch) > 0) {
                map.put(ch, map.get(ch) - 1);
            } else {
            return false;
        }
    }
    return true;
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String a = scan.next();
        String b = scan.next();
        scan.close();
        boolean ret = isAnagram(a, b);
        System.out.println( (ret) ? "Anagrams" : "Not Anagrams" );
    }
} 

我只是将它复制并粘贴到我自己的 IDE 中,但在第 18 行出现了三个编译错误:

map.merge(ch, 1, Integer::sum);

这么说

')' expected,   
illegal start of expression,   
error: ';' expected.

我不明白,因为我没有看到任何括号或任何遗漏。 代码显然也适用于作者。 谁能帮我看看问题?

另外,有没有办法在不使用哈希图的情况下比较两个字符串以查看它们是否是字谜? 可能使用 string to char[] 方法和 for 循环? (这是我最初想到的方法,我对哈希图一点也不熟悉。)

首先这段代码没问题,在我的环境下运行良好,可以使用java -version查看自己的JDK版本

这是我的 JDK 版本

$ java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)

Lambda 表达式Integer::sum是JDK8 及以后版本支持的特性,如果你使用的是1.8 以下的JDK 版本,则无法编译成功;

然后,让我们谈谈字谜:

我们可以使用一个数组,即字符的索引,然后统计每个字符在字符串中出现的次数。 在第一个字符串中,出现的每个字符都添加到相应的数组位置。 在第二个字符串中,每个出现的字符都从数组的相应位置减去一个。 所以我们要做的是遍历第一个字符串,然后遍历第二个字符串,并且这两个字符串都将成为 Anagrams 的唯一方法是该数组是否仍然全部为 0。这意味着一个两个字符串的字符数相同。

  1. 生成 256 位整数数组 k
  2. 对于第一个字符串sFirst中的每个字符x,x的整数值为y,将k[y]加到1
  3. 对于第二个字符串 sSecond 中的每个字符 x,x 的整数值为 y,将 k[y] 减去 1
  4. 如果数组 k 仍然全为零,则字符串 sFirst 和 sSecond 是 Anagrams

——

public class CustomStringUtil {
    public static boolean secondIsAnagram(String sFirst, String sSecond) {
        if (sFirst.length() != sSecond.length()) {
            return false;
        }
        int[] asciiChars = new int[256];
        for (int i = sFirst.length() - 1; i >= 0; --i) {
            ++asciiChars[sFirst.charAt(i)];
        }
        for (int i = sFirst.length() - 1; i >= 0; --i) {
            char currChar = sSecond.charAt(i);
            if (asciiChars[currChar] == 0) {
                return false;
            }
            --asciiChars[currChar];
        }
        return true;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM