【问题标题】:String anagram in JavaJava中的字符串字谜
【发布时间】:2020-06-20 07:03:42
【问题描述】:

我正在尝试为符合以下条件的字符串字谜创建一个程序:

  1. 方法应该只允许在字谜中使用字母、空格、逗号和点。如果还有其他字符,则字符串不能包含字谜。
  2. 该方法在检查文本时应忽略所有空格、逗号和点。
  3. 如果文本中没有字母,则文本不能是字谜。
import java.util.Arrays;
import java.util.Scanner;

public class StringAnagram {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        System.out.print("Enter first string: ");
        String first = in.nextLine().toUpperCase();


        System.out.print("Enter second string: ");
        String second = in.nextLine().toUpperCase();

        String result = isAnagram(first, second);
        System.out.println(result);
    }

private static String isAnagram(String first, String second) {
    String answer = "";


    if (first.matches("[A-Z\\.\\,\\s]")) {
        String st = first.replaceAll("\\.\\,\\s", "");
        String nd = second.replaceAll("\\.\\,\\s", "");
        char[] arraySt = st.toCharArray();
        char[] arrayNd = nd.toCharArray();
        Arrays.sort(arraySt);   
        Arrays.sort(arrayNd);

            if(Arrays.equals(arraySt, arrayNd)) {
                answer = "Anagram.";
            }

            else {
                answer = "No anagram.";
            }
        }

    else  {
        answer = "No anagram.";
    }
    return answer;
}
}

但是当程序测试这两个句子时,它们不是字谜,但它们应该是字谜。我不知道在哪里寻找错误。

  1. 十一加二等于十三。
  2. 十二加一等于十三。

【问题讨论】:

  • 如下所述,您的String.replaceAll 调用存在错误,但我想指出,如果您在比较之前执行此操作以检查超出范围的字符,则检查会变得更加简单

标签: java string anagram


【解决方案1】:

如果您按以下方式开始您的方法,它将完成您问题的1st3rd 点中提到的验证:

if (first == null || second == null || first.equals("") || second.equals("") || !first.matches("[A-Za-z,. ]+")
        || !second.matches("[A-Za-z,. ]+")) {
    return "No anagram.";
}

接下来你应该用"" 替换所有空格、逗号和点,以便忽略它们:

String st = first.replaceAll("[,. ]+", "");
String nd = second.replaceAll("[,. ]+", "");

完整代码如下:

private static String isAnagram(String first, String second) {
    if (first == null || second == null || first.equals("") || second.equals("") || !first.matches("[A-Za-z,. ]+")
            || !second.matches("[A-Za-z,. ]+")) {
        return "No anagram.";
    }
    String answer = "";

    String st = first.replaceAll("[,. ]+", "");
    String nd = second.replaceAll("[,. ]+", "");

    if (st.equals("") || nd.equals("")) {
        return "No anagram.";
    }

    char[] arraySt = st.toCharArray();
    char[] arrayNd = nd.toCharArray();
    Arrays.sort(arraySt);
    Arrays.sort(arrayNd);

    if (Arrays.equals(arraySt, arrayNd)) {
        answer = "Anagram.";
    } else {
        answer = "No anagram.";
    }
    return answer;
}

测试运行:

Enter first string: london
Enter second string: britain
No anagram.

另一个测试运行:

Enter first string: ram
Enter second string: mar
Anagram.

另一个测试运行:

Enter first string: .
Enter second string: .
No anagram.

另一个测试运行:

Enter first string: ,
Enter second string: .
No anagram.

另一个测试运行:

Enter first string: ra.m
Enter second string: a.m.r
Anagram.

【讨论】:

  • 嗨,但是当我输入点(.)逗号(,)或空格时,它会显示字谜。我们一定错过了第三个条件
  • 我确实接受了你的回答。非常感谢,你救了我一个不眠之夜。祝您有美好的一天!
  • 现在,你做对了?。祝你成功!
【解决方案2】:

This: first.matches("[A-Z\\.\\,\\s]") 测试first 值是否为单个字符,可以是 1 个大写字母、点、逗号或任何空白字符。

完全不是你想要的。

您可以在各处添加System.out.println 语句以打印代码所在的位置以及相关变量的值。像您是计算机一样按照代码进行操作。你认为应该发生的事情与 sysout 语句告诉你的不匹配——那里有一个错误(可能有很多,特别是如果你写了这么多东西而没有先测试任何东西)。

更好的是,使用调试器。

注意:用其他任何东西替换你的 No anagram. 字符串之一这样微不足道的事情,这样你就知道这两个中的哪一个被触发了,就会有很大帮助。

注意:first.replaceAll("\\.\\,\\s", ""); 也坏了;你在这里写了太多的代码;测试每个单独的移动部件。就像一辆自行车,组装后什么都做不了:一块一块地拆开,单独测试每一块。

【讨论】:

  • "测试第一个值是否是单个字符"我不太确定。 ^[A-Z\\.\\,\\s]$ 会,但不是代码中的那个。
  • 一切都通向最后一个,我很沮丧
  • @FedericoklezCulloca 就像我写的那样。匹配检查 整个字符串 是否与指定的正则表达式匹配。 ^$ 隐含在 matches 中。你在想的可能是find(这是 Pattern 上的一个方法)。
【解决方案3】:

此解决方案接受来自控制台输入的字符串。这部分被省略了,因为这对你有用。

我们的想法是有选择地将您所比较的内容的本质减少到最低限度。提供注释以解释逻辑。在示例中,除了第三个以外的所有示例都报告为字谜。

        System.out.println(isAnagram("radar", "darar"));
        System.out.println(isAnagram("ra.,. dar", "d.,a  rar"));
        System.out.println(isAnagram("r+a.,. dar", "d.,a + rar"));
        System.out.println(isAnagram("Eleven plus two is thirteen.", "Twelve plus one is thirteen."));

   // This method accepts mixed case strings.  The conversion to upper case is
   // done within the method.   
    public static String isAnagram(String first, String second) {  

        // get rid of allowed characters and convert to upper case 
        String st = first.replaceAll("[., ]","").toUpperCase();
        String nd = second.replaceAll("[., ]","").toUpperCase();

        // Now get rid of all alpha characters and compare to the empty string.
        // Only if both are equal are the strings potential anagrams.  
        // Otherwise, the illegal characters would be present.
        if (st.replaceAll("[A-Z]","").equals("") &&
                nd.replaceAll("[A-Z]","").equals("")) {

             // this is your original code
             char[] arraySt = st.toCharArray();
             char[] arrayNd = nd.toCharArray();
             Arrays.sort(arraySt);   
             Arrays.sort(arrayNd);

             // don't set a value just return it's an
             // anagram
             if (Arrays.equals(arraySt, arrayNd)) {
                     return "Anagram.";
             } 
        }
        // Otherwise, it's not
        return "No Anagram.";
   }

【讨论】:

    猜你喜欢
    • 2020-10-28
    • 2018-03-15
    • 2021-09-16
    • 1970-01-01
    • 2016-06-24
    • 2015-11-11
    • 2016-06-23
    • 2011-09-11
    • 2014-10-24
    相关资源
    最近更新 更多