如何使用HashMap解读单词列表?

时间:2016-10-10 14:11:56

标签: java string methods hashmap

基本上我将获得两个大输入文件。一个是单词列表,另一个是那些相同单词的列表,但单词将被加扰。我必须使用HashMap来获取单词和乱码的列表,然后按字母顺序打印带有真实单词的加扰单词。

例如:

rdib bird

tca cat

gdo dog

到目前为止,我遇到了一些麻烦。我已经创建了一个方法来排序并从单词中获取密钥,但我不确定从那里开始。我想我仍然需要处理乱码,然后将所有内容打印出来。任何解释这些事情的帮助都会非常感激,因为这是我第一次使用HashMap。我目前的,非常不完整的代码如下。

import java.io.*;
import java.util.*;

public class Project5
{
    public static void main (String[] args) throws Exception
    {

        BufferedReader dictionaryList = new BufferedReader( new FileReader( args[0] ) );
        BufferedReader scrambleList = new BufferedReader( new FileReader( args[1] ) );

        HashMap<String, String> dWordMap = new HashMap<String, String>(); 

        while (dictionaryList.ready())
        {
            String word = dictionaryList.readLine();
            dWordMap.put(createKey(word), word);
        }
        dictionaryList.close();

        while (scrambleList.ready())
        {
            String scrambledWords = scrambleList.readLine();
            List<String> dictionaryWords = dWordMap.get(createKey(scrambledWords));
            System.out.println(scrambledWords + " " + dictionaryWords);
        }
        scrambleList.close();
    }   
    private static String createKey(String word)
    {
        char[] characterWord = word.toCharArray(); 
        Arrays.sort(characterWord);
        return new String(characterWord);
    }

2 个答案:

答案 0 :(得分:4)

将dWordMap设为HashMap<String, String>。对于您不确定的行,请执行dWordMap.put(createKey(word), word)

然后遍历scrableList,单词为dWordMap.get(createKey(scrambledWord))

您可能还应该处理扰乱的单词不在原始单词列表中的情况。

理解HashMap的关键概念是,它使O(1)测试映射是否包含给定键,并使O(1)检索与给定键相关联的值。这意味着这些操作需要持续时间 - 无论地图是5个元素还是5000个,确定地图是否包含"ehllo"需要相同的时间。如果要检查这两个列表(字典和加扰),则需要一个对两者都相同的密钥。正如您在解决方案中开始做的那样,对单词中的字母进行排序是一个不错的选择。所以你的HashMap看起来像这样:

{
  "ehllo": "hello",
  "dlorw": "world"
}

一次通过字典列表构建该地图,然后另一次通过它获取加扰的单词,对其中的字母进行排序,然后检查地图以找到未加扰的单词。

答案 1 :(得分:0)

您应该将此任务分解为更小的部分。检查每一个是否有效,然后再继续下一个。

首先,您需要一种将单词转换为键的方法。包含字母表字母字母的字符串是一个很好的关键。写一些通过测试的东西:

assertEquals("dgo", createKey("dog");
assertEquals("act", createKey("cat");

接下来,您需要使用列表中的字词填充地图。你需要通过这个测试的东西:

Map<String,String> map = new HashMap<>();
addToMap(map,"dog");
assertEquals("dog", map.get("dgo");

您的addToMap()方法将使用createKey()

现在应该很清楚,您可以使用您创建的地图,并createKey()从任何排序中找到“狗”:

Map<String,String> map = new HashMap<>();
addToMap(map,"dog");
assertEquals("dog", map.get(createKey("odg"));

您可以将其封装到方法中,以便:

Map<String,String> map = new HashMap<>();
addToMap(map,"dog");
assertEquals("dog", getFromScrambledWord(map,"odg"));

剩下的就是把它们放在一起:

  • 循环浏览字典文件并为每行调用addToMap()
  • 遍历您的乱码文件,为每个文件调用getFromScrambledWord(),打印结果

如果您还需要按字母顺序放置此列表,则不是打印它,而是将结果存储在List中,对列表进行排序,然后循环浏览它以进行打印。

我故意让这不是面向对象的,因为你显然是一个初学者。为了使事情更加OO,请将Map设置为您自己的类中的私有字段:

public class WordStore {
    private final Map<String,String> words = new HashMap<>();

    public void addWord(String word) {
       // your implementation here
    }

    public String getFromScrambled(String scrambledWord) {
       // your implementation here
    }
}

所以测试更像是:

WordStore store = new WordStore(); // the Map is inside the WordStore
store.addWord("dog"); // like addToMap()
assertEquals("dog", store.getFromScrambled("odg"));