【问题标题】:Java matching a given word with combinations of same sizeJava将给定单词与相同大小的组合匹配
【发布时间】:2017-07-25 15:06:13
【问题描述】:

我几乎已经做到了这一点,但还没有完全做到。所以我需要的是例如我给出单词 DOG,程序将查看一个文本文件并返回 DOG 和 GOD,即只能通过给定的赔率生成的单词。我的代码给了我所有包含“D”、“O”和“G”的单词。我的代码是这样的:

public class JavaReadTextFile {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        ReadFile rf = new ReadFile();

        String filename = "/Users/Elton/Desktop/OSWI.txt";
        String wordinput;
        String wordarray[] = new String[1];
        System.out.println("Input Characters: ");
        wordinput = input.nextLine();
        wordarray[0] = wordinput;

        System.out.println(wordinput.length());

        try {
            String[] lines = rf.readLines(filename);

            for (String line : lines) {
                if (line.matches(wordarray[0] + ".*")) {
                    System.out.println(line);
                }
            }
        } catch (IOException e) {
            System.out.println("Unable to create " + filename + ": " + e.getMessage());
        }
    }
}

----- 那么我有:

public class ReadFile {
    String [] cName = new String [100];

    public String[] readLines(String filename) throws IOException {  
        FileReader fileReader = new FileReader(filename);  

        BufferedReader bufferedReader = new BufferedReader(fileReader);  
        List<String> lines = new ArrayList<String>();  
        String line = null;  

        while ((line = bufferedReader.readLine()) != null ) {   
          cName[0] = line.split(" ")[0];  
          lines.add(cName[0]); 
        }  

        bufferedReader.close();  

        return lines.toArray(new String[lines.size()]);  
    }     
}

【问题讨论】:

  • 让我知道您对我的回答有何看法,我们应该找到解决方案。
  • SSCCE 请。

标签: java algorithm


【解决方案1】:

我可以看到你能够从文件中读取单词。其余的工作很简单。算法会是这样的

  • 排序输入字

  • 对从文件中读取的单词进行排序

  • 如果两个单词相同打印或将其添加到某个列表中。

这里是上述算法的简单演示,您可以根据需要对其进行修改。

    public class App {

        static String sortString (String str) {
            char []chars = str.toCharArray();
            sort(chars);
            return new String(chars);
        }
        public static void main(String... args) {
            String inputWord = "DoG";
            String readWord = "God";
            inputWord = inputWord.toUpperCase();
            readWord = readWord.toUpperCase();
            inputWord = sortString(inputWord);
            readWord = sortString(readWord);

            if(inputWord.equalsIgnoreCase(readWord)) {
                System.out.println(readWord);// you can add it to your list
            }

        }
    }

【讨论】:

  • 我认为您应该在调用 sortString(String s) 方法之前将 inputWord 和 readWord 都转换为大写或小写。或者你可以提到 sort(char[] c) 函数会处理它。
【解决方案2】:

如果我理解正确,你想显示一个单词的所有字谜?

更改您的方法 readLines() 以返回 ArrayList 而不是数组。

ArrayList<String> readLines(String fname) {

    File file = new File(fname);
    ArrayList<String> list = null;

    try {
        Scanner scanner = new Scanner(file);
        list = new ArrayList<String>();

        while (scanner.hasNext()) {
            String currentWord = scanner.next();
            if (!currentWord.isEmpty()) {
                list.add(currentWord);
            }
        }
        scanner.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    return list;
}

将此函数与输入参数字典一起使用是您从 readLines 返回的 ArrayList。该函数使用了这样一个事实,即“DOG”和“GOD”等两个字谜在排序后是相等的字符串(即“DGO”等于“DGO”)

public ArrayList<String> getAnagrams(String word, ArrayList<String> dictionary) {
    if(word == null || dictionary == null) {
        return null;
    }

    ArrayList<String> anagrams = new ArrayList<String>();
    char[] sortedChars = word.toCharArray();
    Arrays.sort(sortedChars);
    for(String item : dictionary) {
        char[] sortedDictionaryItem = item.toCharArray();
        Arrays.sort(sortedDictionaryItem);
        if(Arrays.equals(sortedChars, sortedDictionaryItem)) {
            anagrams.add(item);
        }
    }
    return anagrams;
}

如果您不喜欢我建议的更改,也可以执行以下操作。在你做的循环中:

if (line.matches(wordarray[0] + ".*")) {
    System.out.println(line);
}

您可以检查两个字符串是否相互排列:

if (isPermutation(line, wordarray[0]) {
    System.out.println(line);
}

通过添加这两个函数:

String sortString(String s) {
    char[] chars = s.toCharArray();
    java.util.Arrays.sort(chars);
    return new String(chars);
}

boolean isPermutation(String s1, String s2) {
    if(s1.length() != s2.length()) {
        return false;
    }
    s1 = sortString(s1);
    s2 = sortString(s2);
    return (s1.compareTo(s2) == 0);
}

【讨论】:

    【解决方案3】:

    这可以帮助您调整代码。

    import java.util.regex.* ;
    
    public class Find_Dogs_And_Gods
    {
        public static void main(String []args)
        {
            String line = "2ldoghmDoggod" ;
    
            Pattern p = Pattern.compile("[d,D,g,G][o,O][d,D,g,G]") ;
            Matcher m = p.matcher(line) ;
    
            while(m.find() )
            {
                System.out.println( m.group() ) ;
            }
        }
    }
    

    【讨论】:

    • 那是我的意图,找到任意组合的两个词。如果您查看该模式,应该很容易找到带有大写字母的单词。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    相关资源
    最近更新 更多