代码之家  ›  专栏  ›  技术社区  ›  John Mathews

Java Hashmaps单词分组不会返回多个ArrayList

  •  0
  • John Mathews  · 技术社区  · 12 年前

    对于一项家庭作业,我必须创建一个程序来作弊。为了做到这一点,我需要想出一种通过单词字母位置将单词分组到族中的方法。因此,例如,如果单词长度为4,他们猜测“e”,那么所有以“-e”为开头的单词都将出现在以该模式为键的哈希图的一个数组列表中,而所有以“e-”为结尾的单词都会出现在另一个以该模式为键的相同哈希图的数组列表中。我的问题是,尽管我的程序能够识别模式。它仍然返回一个空集或一个包含所有单词的ArrayList。一个多小时以来,我一直在尝试不同的东西,但似乎无法将它们正确分组。非常感谢您的帮助。这是我为这个类编写的代码,它将单词分离并添加到Hashmap中。

    import java.util.ArrayList;
    import java.lang.StringBuilder;
    import java.util.HashMap;
    
    public class EvilEngine 
    {
    HashMap<StringBuilder, ArrayList> families = new HashMap<StringBuilder, ArrayList>();
    int k = 0;
    ArrayList<String> currentList = new ArrayList();
    StringBuilder blankPattern = new StringBuilder("");
    StringBuilder newPattern = new StringBuilder("");
    
    
    public void PatternMatcher(ArrayList wordlist, char guess, Integer wordlength)
    {
    
        String word;
        int j = 0;
        int x = 0;
        int biggest = 0;
        StringBuilder longest = null;    
    
        while(x < wordlist.size())
        {
            int i = 0;
            int index = 0;
            for (i=0; i < wordlength; i++)
            {
                blankPattern = blankPattern.append("-");
            }
            boolean boo = false;
            newPattern = blankPattern;
            word = (String) wordlist.get(x);
            index = word.indexOf(guess);
            while (index >= 0) 
            {
                blankPattern.setCharAt(index, guess);
                newPattern = blankPattern;
                index = word.indexOf(guess, index + 1);
            }
            this.PatternCompiler(word,newPattern);
            blankPattern = blankPattern.delete(0,wordlength);
            x++;
        }
    }
    public void PatternCompiler (String word, StringBuilder pattern)
    {
            if(!families.containsKey(pattern))
            {
                ArrayList<String> newPatternList = new ArrayList();
                newPatternList.add(word);
                families.put(pattern, newPatternList);
            }
            if (families.containsKey(pattern))
            {
                ArrayList<String> oldPatternList = new ArrayList();
                oldPatternList = families.get(pattern);
                oldPatternList.add(word);
                families.put(pattern, oldPatternList);
            }
            else {
                System.out.println("Error");
            }
    
    }
    public HashMap<StringBuilder, ArrayList> returnFamilies (){
        return families;
    }
    }
    
    1 回复  |  直到 12 年前
        1
  •  0
  •   Turix    12 年前

    虽然您的代码或多或少有几个小问题,但我怀疑主要问题是 HashMap 具有类型为的键 StringBuilder 而不是 String . 哈希图 使用 hashCode() 键对象的函数,以确定它是否已经在地图中。对于 字符串拼接 ,散列值可能只是对象的地址(使用从 Object 类)。

    自从 newPattern 是一个类级变量,当您将其传递给 PatternCompiler() 函数,参数 pattern 只有一个 参考 相同的 类级别对象(即将具有相同的哈希代码)。这个对象(以及它的哈希代码)在您的代码中永远不会更改,因为 blankPattern 也是在类级别声明的,并且在更改 价值 属于 空白图案 ,您永远不会更改它所指的对象。因此,将其重新分配给 新模式 每次通过 while 循环不会改变任何东西(基本上是混乱的)。

    要解决此问题,您需要将 哈希图 一串 而不是 字符串拼接 这个 一串 类定义 hashCode() 函数,它将根据字符串的实际内容返回不同的代码(而不是像 字符串拼接 ). (此外,如前所述,没有理由 空白图案 在类级别声明,而不是仅在 PatternMatcher() 功能,而您不需要 新模式 )

    虽然这是代码的主要问题,但另一个相当大的问题与第二个问题有关 if 您的状况 模式编译器() 作用在前面 如果 如果阵列中还没有新的ArrayList,则可以将其添加到族中。所以不管怎样,第二个 如果 有条件的( if (families.containsKey(pattern)) )在那一点上将是正确的。因为两个块都添加了 word 到的列表 families ,有些单词可能会被添加两次。

    祝你好运