【问题标题】:Storing groups of words in hashtable在哈希表中存储单词组
【发布时间】:2017-05-12 06:01:09
【问题描述】:

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

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

例如:

  • 列表中有 10 个单词
  • 其中5个是彼此的字谜
  • 其中2个也是彼此的字谜(但不属于第一组)
  • 所以,3组;一组字词组(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);
}

我确信这可以适用于比较无限数量的字符串。然后下一个难题是确保将单独的字谜组存储在哈希表中。

【问题讨论】:

  • 你尝试了什么?
  • 蛮力解决方案是将每个单词与其他单词进行比较,并在找到 Anagram 时存储。
  • 最简单的方法是遍历所有单词并将每个单词 w 与其他单词进行比较 9. 制作哈希表:w - > w. 的字谜
  • @Bhargav 但是,如果有超过 1 组字谜,如何使它起作用

标签: java arraylist hashtable


【解决方案1】:
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);
    }

}

【讨论】:

  • 谢谢,但我真的很想使用 HashTable,因为这是我自学的对象。
  • 如何截断只包含一个单词的哈希表“行”(键)?
  • 我没有。您可以迭代条目,只留下列表大小> 1的值。
  • 如何省略只包含一 (1) 个单词的字谜列表?我设法做到这一点的唯一方法(并且有点作弊)是使用if 语句来打印哈希表,如果与密钥关联的列表的大小大于1,它只会打印密钥: int i = 1; for (String key : res.keySet()) { List&lt;String&gt; value = res.get(key); if (value.size() &gt; 1) { System.out.println("Anagram " + i + ": " + value); i++;}}
  • 是的。没关系
【解决方案2】:

我看到您已经发现您可以对字符串进行排序以找出两个字符串是否是字谜。

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

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

【讨论】:

    猜你喜欢
    • 2017-05-11
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2015-07-18
    • 2015-05-26
    • 2011-11-17
    • 1970-01-01
    • 2013-11-10
    相关资源
    最近更新 更多