2017-05-12 6 views
0

私は単語のArrayListを持っています、そして、それらを互いに比較して、それらをHashTable(アナグラムのグループ)に格納したいと思います。ハッシュテーブルに単語のグループを格納する

私は2つのワードをアナグラムかどうかをテストする方法を知っていますが、長いリストの比較方法を理解することはできません。例えば

  • それらのリスト
  • 5で10個の単語がそれらの互いに
  • 2のアナグラムがあり、またお互いのアナグラムである(ただし、第1グループの)されています
  • したがって、3つのグループ。 1セットのアナグラム(5ワード)、1グループ(2ワード)、および1グループ(3ワード)のランダムワードのグループ1つのグループを選択します。

+ 2アナグラムを作成し、それらのアナグラムグループ(別々に)をハッシュテーブルに保存しますか?

EDIT:

二つの単語を比較するため、私が持っているコード:

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

ブルートフォース解決策は、アナグラムを見つけるたびに、すべての単語を他の単語と比較して保存することです。 – Bhargav

+1

最も単純な方法は、すべての単語をループし、各単語* w *を他の単語と比較することです。ハッシュテーブルを作成します。* w * - > * 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); 
    } 

} 

UPDATE:

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

ハッシュテーブルを使用するように更新されました – StanislavL

+0

ハッシュテーブルの "行"(キー)を1単語しか切り捨てる方法はありますか? – RThomP

1

2つの文字列がアナグラムであるかどうかを調べるために文字列を並べ替えることができます。

キーがソートされた文字列の場合は、各文字列をハッシュテーブルに格納できます。例えば、 "CBA"という文字列が "ABC"という場所に保存されると、文字列のアナグラムが既に出現しているかどうかを確認するだけで十分です。

実際に文字列そのものが必要な場合は、それらをリストのリストに格納するか、マルチマップを使用することをお勧めします。 Hashtableのため

関連する問題