检查字谜的奇怪比较问题

Odd comparison problem in checking for anagram

提问人:akbiggs 提问时间:12/13/2009 更新时间:12/13/2009 访问量:909

问:

对不起,标题太糟糕了;然而,我想不出更好的方法来总结我的困境。

在尝试解决一个问题时,我实现了一个解决方案,包括从两个字符串中删除所有空格,将它们都转换为字符数组,对它们进行排序,然后查看它们是否相等。

如果是这样,程序会打印出“Is an anagram.”,否则会打印出“Is not an anagram”。

问题在于,即使我的代码编译成功并运行良好,最终结果始终是“不是字谜”,无论两个原始字符串是否确实是彼此的字谜。我为调试而插入的快速代码表明,在实际字谜的情况下,我最终比较的两个字符数组显然是相同的,但比较的结果是错误的。

我无法确切地说出为什么会发生这种情况,除非我忽略了一些非常明显的东西,或者在我比较的东西中有一些额外的未显示字符。

代码如下:

import java.util.Arrays;
import java.util.Scanner;
public class Anagram {
    public static void main(String[] args) {
        char[] test1;
        char[] test2;
        Scanner input = new Scanner(System.in);
        System.out.print("Enter first phrase>");
        test1 = input.nextLine().replaceAll(" ", "").toCharArray();
        Arrays.sort(test1);
        System.out.print("Enter second phrase>");
        test2 = input.nextLine().replaceAll(" ", "").toCharArray();
        Arrays.sort(test2);
        if (test1.equals(test2)) {
            System.out.println("Is an anagram.");
        }
        else {
            System.out.println("Is not an anagram.");
        }
        /* debugging */
        System.out.println(test1);
        System.out.println(test2);
        System.out.println(test1.equals(test2));
    }
}

以及测试运行的结果输出:

Enter first phrase>CS AT WATERLOO
Enter second phrase>COOL AS WET ART
Is not an anagram.
AACELOORSTTW
AACELOORSTTW
false

非常感谢任何和所有的帮助。

Java 比较

评论


答:

2赞 John Kugelman 12/13/2009 #1

使用 Arrays.equals() 方法比较两个数组。它将比较数组的元素,而默认方法不会。Object.equals()

如果两个指定的字符数组彼此相等,则返回。如果两个数组包含相同数量的元素,并且两个数组中所有相应的元素对相等,则两个数组被视为相等。换句话说,如果两个数组以相同的顺序包含相同的元素,则它们相等。此外,如果两个数组引用都是 ,则认为两个数组引用相等。truenull

1赞 Anon. 12/13/2009 #2

数组本身的方法不会比较数组的内容。.equals

如果你想这样做,你必须自己做 - 比如:

for(int i = 0; i < test1.length; i++) {
    if(test1[i] != test2[i]) {
        return false;
    }
}
return true;

编辑:或使用静态.Arrays.equals