2017-05-12 96 views
0

我有一個ArrayList單詞,我想比較單詞之間的相互關係,將它們存儲在HashTable(在一組字符串中)。在散列表中存儲單詞組

我知道如何比較兩個單詞來測試它們是否是一個字謎,但我不知道如何比較一個較長的單詞列表。

例如:

  • 有10個字列表中的
  • 其中5是它們的相互
  • 2字謎也彼此的字謎(但不是所述第一組)
  • 所以,3組; 1組一組anagrams(5個字),1組爲另一組(2字),和1組(3字)的隨機字

如何比較10個單詞以找到那5個+2個anagrams,並將這些anagrams組(分別)存儲在散列表中?

編輯:

的代碼我有比較兩個字:

public static boolean isAnagram(String firstWord, String secondWord) { 

    boolean anagram; 
    if (firstWord.length() != secondWord.length()) { 
     return false; 
    } 
    firstWord = firstWord.toLowerCase(); 
    secondWord=secondWord.toLowerCase(); 
    char[] c1 = firstWord.toCharArray(); 
    char[] c2 = secondWord.toCharArray(); 
    Arrays.sort(c1); 
    Arrays.sort(c2); 
    String sc1 = new String(c1); 
    String sc2 = new String(c2); 
    if (sc1.equals(sc2)) { 
     System.out.println("ANAGRAMS"); 
    } else { 
     System.out.println("NOT ANAGRAMS"); 
    } 
    return sc1.equals(sc2); 
} 

我敢肯定,這可以適應與比較字符串無限量的工作。接下來的困境是確保單獨的字符組存儲在散列表中。

+0

那你試試? – Kajal

+2

暴力解決方案將比較每個單詞與其他單詞,並存儲每當你找到一個Anagram。 – Bhargav

+1

最簡單的方法是遍歷所有單詞並將每個單詞* w *與其他單詞進行比較。9.製作哈希表:* w * - > anagrams of * w *。 – Shaido

回答

2
import org.springframework.util.LinkedMultiValueMap; 
import org.springframework.util.MultiValueMap; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class AnagramDetector { 
    public static void main(String[] args) { 
     List<String> words = new ArrayList<>(); 
     words.add("Abc"); 
     words.add("cba"); 
     words.add("bca"); 
     words.add("bc"); 
     words.add("ba"); 
     words.add("ab"); 

     MultiValueMap<String, String> res = new LinkedMultiValueMap<>(); 
     words.stream().forEach(word -> { 
      String key = getAnagramKey(word); 
      res.add(key, word); 
     }); 
     System.out.println(res); 
    } 
    public static String getAnagramKey(String word) { 
     char[] c = word.toLowerCase().toCharArray(); 
     Arrays.sort(c); 
     return new String(c); 
    } 

} 

更新哈希表:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Hashtable; 
import java.util.List; 

public class AnagramDetector { 
    public static void main(String[] args) { 
     List<String> words = new ArrayList<>(); 
     words.add("Abc"); 
     words.add("cba"); 
     words.add("bca"); 
     words.add("bc"); 
     words.add("ba"); 
     words.add("ab"); 

     Hashtable<String, List<String>> res = new Hashtable<>(); 
     words.stream().forEach(word -> { 
      String key = getAnagramKey(word); 
      List<String> anWords = res.get(key); 
      if (anWords == null) { 
       anWords = new ArrayList<>(); 
       res.put(key, anWords); 
      } 
      anWords.add(word); 
     }); 
     System.out.println(res); 
    } 
    public static String getAnagramKey(String word) { 
     char[] c = word.toLowerCase().toCharArray(); 
     Arrays.sort(c); 
     return new String(c); 
    } 

} 
+0

謝謝,但是我真的很想使用一個HashTable,因爲這是我自學的對象。 – RThomP

+1

更新爲使用HashTable – StanislavL

+0

如何截斷只包含一個單詞的哈希表「行」(鍵)? – RThomP

1

我看到你已經想通了你可以對字符串進行排序,找出兩個字符串是否是字謎。

當鍵是排序的字符串時,可以將每個字符串存儲在散列表中。例如,字符串「CBA」將被保存在「ABC」中,然後很容易檢查字符串是否已經出現。

如果你確實需要自己的字符串,那麼你可以將它們存儲在列表中,或者更好的方法是使用Multimap。