基本上我将获得两个大输入文件。一个是单词列表,另一个是那些相同单词的列表,但单词将被加扰。我必须使用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);
}
答案 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"));