【问题标题】:Compilation error when comparing two anagrams while using a hashmap使用哈希图比较两个字谜时的编译错误
【发布时间】:2019-02-02 13:15:44
【问题描述】:

我必须找到一种方法来检查两个字符串是否是字谜。如果是,则该方法应返回 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.

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

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

【问题讨论】:

  • 我可能使用的另一种方法是遍历单词中的每个字母,检查第二个单词是否包含该字母。如果它确实从第二个单词中删除它。如果它不返回 false。
  • 当我在我的 IDE 上运行它时,它编译得很好
  • 这太奇怪了,我多次复制并粘贴了该代码,但仍然出现该错误...谢谢您的想法。
  • 听起来你的程序中有一个流浪的}/{/(/)
  • 您正在使用 java 8 中引入的方法参考 Integer::sum.. 您使用的是旧版本吗?

标签: java arrays string compiler-errors hashmap


【解决方案1】:

首先这段代码没有问题,在我的环境下运行良好,可以使用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;
    }
}

【讨论】:

  • 对不起我的菜鸟问题,但你为什么选择 256 整数数组?我的意思是你是怎么想出数字 256 的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多