簡體   English   中英

如何用txt制作Java Anagrams

[英]How to make Java Anagrams from txt

我有Java主班。 並且需要編寫類Anagrams。 主要是:

public class Main {
    public static void main(String[] args) throws FileNotFoundException {

           String home = System.getProperty("user.home");
           String allWords = home + "/allwords.txt";

           Anagrams an = new Anagrams(allWords);

           for(List<String> wlist : an.getSortedByAnQty()) {
                 System.out.println(wlist);
           }

           System.out.println("************************");

           Scanner scan = new Scanner(new File(home, "wordsToFind.txt"));

           while(scan.hasNext()) {
                 System.out.println(an.getAnagramsFor(scan.next()));
           }

           scan.close();
    }
}

例如:

文件allwords.txt

安第斯山脈迪恩斯院長邪惡加爾斯lags萊維生活轎車渣街頭測試員起義面紗邪惡

wordsToFind.txt

邪惡的街頭起義

最后,我們將獲得:

[邪惡,利維,生活,面紗,卑鄙]

[安第斯山脈,丹麥人,教務長,轎車]

[gals,lags,slag]

[街道,測試人員]

[起義]


邪惡的:[利維,活着,面紗,卑鄙的人]

街道:[測試人員]

起義:[]

我創建了Anagrams類,並編寫了一種方法來檢查單詞是否為anagram。 該方法返回布爾值:

public static boolean IsAnagrams(String str1, String str2) {
        char word1[] = str1.toLowerCase().replaceAll("\\W","").toCharArray();
        char word2[] = str2.toLowerCase().replaceAll("\\W","").toCharArray();   
        Arrays.sort(word1);
        Arrays.sort(word2);
        return (Arrays.equals(word1, word2));

    }

但是我不知道現在該怎么辦。 我必須編寫方法:

  • getSortedByAnQty()-返回字謎列表
  • String getAnagramsFor(String word)-從wordsToFind.txt返回單詞的字謎列表

我該怎么做?

給定以下代碼,您將獲得單詞的所有字符排列。 如果充實isValidWord(),則可以將其設置為字典中的單詞(allWords.txt?)。 該方法根據可用字符構建排列,因此無需檢查排列是否為字謎。

public boolean isValidWord(String word) {
    return true; // return you dictionary check here
}

public Set<String> getAnagramsFor(String word, String letters) {
    Set<String> set = new HashSet<>(); // no duplicates because of a letter occuring more than once
    if (letters.isEmpty()) {
        if (isValidWord(word)) {
            set.add(word);
        }
    } else {
        for (int i = 0; i < letters.length(); i++) {
            String restOfLetters = letters.substring(0, i) + letters.substring(i + 1);
            set.addAll(getAnagramsFor(word + letters.charAt(i), restOfLetters));
        }
    }
    return set;
}

public void run() {
    System.out.println(getAnagramsFor("", "tea"));
    System.out.println(getAnagramsFor("", "foo"));
}

這些測試電話

    System.out.println(getAnagramsFor("", "tea"));
    System.out.println(getAnagramsFor("", "foo"));

打印

[tea, aet, eta, ate, tae, eat]
[foo, oof, ofo]

希望這可以幫助。

編輯:作為第二種解決方案,關於受限詞典,您可以瀏覽詞典並檢查每個單詞是否是單詞的字謎。 在這兩個代碼中都是解決方案,順便說一句,這里的原始單詞不再是結果集的一部分:

private List<String> wordsToFind = Arrays.asList(new String[] { "evil", "streets", "uprising" });

private List<String> validWords = Arrays.asList(new String[] { "andes", "danes", "deans", "evil", "gals",
        "lags", "levi", "live", "sedan", "slag", "streets", "testers", "uprising", "veil", "vile" });

public boolean isValidWord(String word) {
    return validWords.contains(word);
}

public Set<String> getAnagramsFor(String word, String letters) {
    Set<String> set = new HashSet<>(); // no duplicates because of a letter occuring more than once
    if (letters.isEmpty()) {
        if (isValidWord(word)) {
            set.add(word);
        }
    } else {
        for (int i = 0; i < letters.length(); i++) {
            String restOfLetters = letters.substring(0, i) + letters.substring(i + 1);
            set.addAll(getAnagramsFor(word + letters.charAt(i), restOfLetters));
        }
    }
    return set;
}

public Set<String> getAnagramsFor1(String word) {
    Set<String> anagrams = getAnagramsFor("", word);
    anagrams.remove(word); // remove original word from the result set
    return anagrams;
}

public boolean isAnagram(String str1, String str2) {
    char word1[] = str1.toLowerCase().replaceAll("\\W", "").toCharArray();
    char word2[] = str2.toLowerCase().replaceAll("\\W", "").toCharArray();
    Arrays.sort(word1);
    Arrays.sort(word2);
    return (Arrays.equals(word1, word2));
}

public Set<String> getAnagramsFor2(String word) {
    Set<String> anagrams = new HashSet<>();
    for (String potentialAnagram : validWords) {
        if (!word.equals(potentialAnagram) && isAnagram(potentialAnagram, word)) {
            anagrams.add(potentialAnagram);
        }
    }
    return anagrams;
}

這個測試代碼

    for (String wordToFind : wordsToFind) {
        System.out.println(wordToFind + ": " + getAnagramsFor1(wordToFind));
        System.out.println(wordToFind + ": " + getAnagramsFor2(wordToFind));
    }

帶來

evil: [veil, vile, levi, live]
evil: [veil, vile, levi, live]
streets: [testers]
streets: [testers]
uprising: []
uprising: []

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM