2015-11-04 35 views
1

我有Java中的Main類。並需要編寫類的Anagrams。 主要是:如何從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

安第斯山脈丹麥迪恩斯邪惡加侖滯後列維直播轎車 渣街道測試起義面紗卑鄙

wordsToFind.txt

罪惡街頭起義

然後在最後,我們將有:

[惡,李維斯,住,面紗,卑鄙]

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

[gals,lag,slag]

[街道,測試人員]

[起義]


邪:[李維,住,面紗,卑鄙]

街道:[測試]

起義:[]

我創建了類Anagrams,並且寫了一個方法來檢查單詞是否是anagrams。該方法返回boolen:

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() - 字謎返回列表
  • 字符串getAnagramsFor(串詞) - 從wordsToFind.txt

如何字謎單詞的退貨單我可以做嗎?

+0

爲getAnagramsFor(串詞)當你讀allWords.txt時,你可以建立一個Map >。使用每個單詞的排序版本作爲鍵。當您想要查找單詞的字母時,只需對字母進行排序,然後從地圖中獲取列表。 – Thevenin

+0

getSortedByAnQty()應該做什麼?你能給個例子嗎? – Thevenin

+0

getSortedByAnQty()從allwords.txt獲取單詞並找到anagrams。這是例子的第一部分。像那樣:[邪惡,levi,活,面紗,邪惡],[安第斯,丹麥人,院長,轎車]。方法必須返回一列字符。 – RomaSeba

回答

0

鑑於以下代碼,您可以獲得一個單詞的所有字符排列。如果你填充了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] 

希望這有助於。

編輯:作爲第二個解決方案,並且關於您的受限詞典,您可以瀏覽您的詞典並檢查每個單詞是否是您的單詞的一個字母。在這段代碼是這兩種解決方案,BTW這裏的原詞是結果集的部分不再:

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: []