Java 使用hashmap比较两个字谜时出现编译错误

Java 使用hashmap比较两个字谜时出现编译错误,java,arrays,string,compiler-errors,hashmap,Java,Arrays,String,Compiler Errors,Hashmap,我必须找到一种方法来检查两个字符串是否是字谜。如果是,则该方法应返回true,否则返回false。由于我自己无法想出一个正确的方法来做这件事,我找到了Rodney Shaghoulian的另一段代码(Github:Github.com/RodneyShag,HackerRank:HackerRank.com/RodneyShag),它应该可以工作: import java.io.*; import java.util.*; public class Solution { static

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

')' expected,   
illegal start of expression,   
error: ';' expected.
我不明白,因为我没有看到任何括号或任何遗漏。代码显然也对作者起了作用。 谁能帮我看看这个问题吗


还有,有没有办法在不使用hashmap的情况下比较两个字符串以确定它们是否是字谜?是否可能使用string to char[]方法和for循环?(这是我最初提出的方法,我对hashmaps一点也不熟悉。)

首先,这段代码没有问题,在我的环境中运行良好,您可以使用
java-version

这是我的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版本,则无法成功编译

然后,让我们来谈谈字谜:

我们可以使用一个数组,它是字符的索引,然后计算字符串中每个字符出现的次数。在第一个字符串中,出现的每个字符都被添加到相应的数组位置。在第二个字符串中,将从数组的相应位置减去出现的每个字符。我们要做的是遍历第一个字符串,遍历第二个字符串,如果这个数组仍然都是0,那么这两个字符串都将是字谜。这意味着两个字符串中的一个具有相同的字符数

  • 生成一个256位整数数组k
  • 对于第一个字符串sFirst中的每个字符x,x的整数值为y,将k[y]与1相加
  • 对于第二个字符串sSecond中的每个字符x,x的整数值为y,减去k[y]乘以1
  • 如果数组k仍然全部为零,则字符串sFirst和sSecond是anagram
  • -


    我可以使用的另一种方法是迭代单词中的每个字母,检查第二个单词是否包含该字母。如果它确实从第二个单词中删除它。如果它没有返回false,当我在IDE上运行它时,它会编译得很好。这太奇怪了,我复制并粘贴了多次代码,但仍然会出现错误。。。谢谢你的想法。听起来你有一个流浪的
    }
    /
    {
    /
    /
    在您的程序中。您正在使用java 8中引入的方法引用
    Integer::sum
    。您使用的是旧版本吗?很抱歉,我的问题是,您为什么选择256整数数组?我的意思是,您是如何得出256这个数字的?
    $ 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)
    
    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;
        }
    }