【问题标题】:Anagram Checker to solve the Tube Quiz字谜检查器来解决管测验
【发布时间】:2019-09-14 19:44:24
【问题描述】:

正如您在标题中看到的那样,我正在尝试编写一个程序,它分别为我解决了“夜间标准试管测验”。它的一部分。它必须能够在地铁站名称中找到字谜。我在互联网上找到了很多代码来检查两个单词是否是字谜。但我需要一些不同的东西:我想为程序提供伦敦所有地铁站的名称,并给它一个字谜来比较和检查它是否适合其中一个车站名称。我怎么做? 您会在下面看到我的“比较两个单词”代码:

package anagram;

import java.util.Arrays;  

    public class anagram {  
        static void isAnagram(String str1, String str2) {  
            String s1 = str1.replaceAll("\\s", "");  
            String s2 = str2.replaceAll("\\s", "");  
            boolean status = true;  
            if (s1.length() != s2.length()) {  
                status = false;  
            } else {  
                char[] ArrayS1 = s1.toLowerCase().toCharArray();  
                char[] ArrayS2 = s2.toLowerCase().toCharArray();  
                Arrays.sort(ArrayS1);  
                Arrays.sort(ArrayS2);  
                status = Arrays.equals(ArrayS1, ArrayS2);  
            }  
            if (status) {  
                System.out.println(s1 + " and " + s2 + " are anagrams");  
            } else {  
                System.out.println(s1 + " and " + s2 + " are not anagrams");  
            }  
        }  

        public static void main(String[] args) {  
            isAnagram("Keep", "Peek");  
            isAnagram("Mother In Law", "Hitler Woman");  
        }  
    }  

【问题讨论】:

  • 什么不起作用?
  • “我在互联网上找到了很多代码来检查两个单词是否是字谜。” - 你这样做是错误的。学习编程不是学习在互联网上搜索现有的解决方案。这是关于学习自己编写它们。从头开始。
  • “给它一个字谜来比较和检查”这句话是什么意思?您是否要检查输入字符串是否与给定列表中的任何字符串是字谜?或者你想检查一个输入列表是否包含任意两个互为字谜的字符串?如果你澄清这一点,我可以帮助你。

标签: java anagram


【解决方案1】:

简单:

  • 首先构建一个管字集合,其中的字符是小写并排序的(例如keep --> eekp)。
  • 对于您要检查的每个候选人,执行相同的操作(例如 Peek --> eekp)并在您的收藏中搜索。
  • 如果找到,则表示您找到了一个字谜。

例子:

public static String orderString(String candidate) {
    char[] ccc = candidate
        .replaceAll("[^\\p{IsAlphabetic}]", "")
        .toLowerCase()
        .toCharArray();
    Arrays.sort(ccc);
    return String.valueOf(ccc);
}

public static void main(String... args) {
    Collection<String> tubeStations 
        = Arrays.asList("Acton Town", 
             "Acton Central", "Aldgate", 
             "Aldgate East", "Alperton", 
             "...");
    Map<String, String> tubeMapAnagram = new java.util.LinkedHashMap<>();
    for (String currCandidate: tubeStations) {
        tubeMapAnagram.put(orderString(currCandidate), currCandidate);
    }
    String myCandidate = "Alpen Tor";
    String foundOriginal = tubeMapAnagram.get(orderString(myCandidate));
    if (foundOriginal!=null) {
        System.out.println("anagram found for '"+foundOriginal+"'");
    }
}

使用orderString() 方法甚至可以使您的原始示例变得更简单。

boolean isAnagram(String str1, String str2) {
    return Objects.equals(orderString(str1), orderString(str2));
}

【讨论】:

  • 我更喜欢Set 而不是List
  • @Lino:当然,我也会。因此我提到了“收藏”。泰。
  • 谢谢您,这非常有效!正是我想要的。现在我尝试理解代码,因为我是 Java 初学者。
【解决方案2】:

您的代码有效。您需要一种将所有电台名称插入列表的方法吗?

  public static void main(String[] args) {  
        String[] station = {"first", "second", "third", ..., "last"};
        String check = "anagram";

     for(int i=0; i < station.length(); i++){
        isAnagram(station[i], check);  

    }  }

【讨论】:

    猜你喜欢
    • 2016-11-08
    • 2023-03-09
    • 2012-10-11
    • 2015-10-31
    • 2018-08-05
    • 2019-04-16
    • 2023-03-22
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多