在哈希表中存储单词组

时间:2017-05-12 06:01:09

标签: java arraylist hashtable

我有一个单词的ArrayList,我想将这些单词相互比较,将它们存储在HashTable中(以字谜为一组)。

我知道如何比较两个字来测试它们是否是一个字谜,但我无法弄清楚如何比较更长的单词列表。

例如:

  • 列表中有10个单词
  • 其中5个是彼此的字谜
  • 其中2个也是彼此的字谜(但不属于第一组)
  • 所以,3组; 1组一组字谜(5个单词),1组另一组(2个单词),1组(3个单词)随机单词

如何比较10个单词以找到那些5 + 2个字谜,并将这些字谜组(单独)存储到哈希表中?

修改

我用来比较两个单词的代码:

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);
}

我确信这可以适应比较无限数量的字符串。然后,下一个困境是确保将不同的字谜组存储在哈希表中。

2 个答案:

答案 0 :(得分: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);
    }

}

Hashtable的更新:

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);
    }

}

答案 1 :(得分:1)

我看到你已经发现你可以对字符串进行排序,以确定两个字符串是否为字谜。

当键是排序字符串时,您可以将每个字符串存储在哈希表中。例如,字符串“CBA”将保存在点“ABC”中,然后很容易检查字符串的字谜是否已经出现。

如果您确实需要字符串本身,那么您可以将它们存储在列表列表中,或者更好的方法是使用Multimap。