按键值将新项追加到哈希映射中包含的数组中

时间:2015-02-20 09:41:40

标签: java hashmap append

我正在读取目录的所有文件并尝试保存所有单词,从该目录中关联的所有文件到哈希映射,这些单词将存储在作为目录名称的键下。

例如,名为atheism的目录包含一个名为a0.txt的文件,其中包含单词Gott,同一目录中名为a1.txt的另一个文件包含单词{{} 1}},第三个名为ist的文件包含单词a2.txt。我想在哈希映射键tot下保存所有这些单词。

后来我想概括一下这是为了能够容纳特定目录的键值背后的大型多行文档,下面我发布了我正在使用的代码来填充哈希映射。

我看了this试图调整它,但最后我发现它并不适合我的情况。

我想要做的是从hashmap中访问与特定键相关联的数组,并将新单词添加到其末尾。怎么做?

我需要这些词,因为这是实现感知器算法的程序的一部分,我将这些词保存为生成词袋模型特征向量的过程的一部分。

atheism

3 个答案:

答案 0 :(得分:0)

为什么你不能尝试这个模型

Map<String,Map<String,String>> directoryFiles = new HashMap<>();
Map<String,String> fileNameAndContents = new HashMap<>();
//Create all file contents map add it to main map
directoryFiles.put("directory", fileNameAndContents);


public static void main(String[] d) throws Exception {
    Map<String,Map<String,String>> directoryFiles = new HashMap<>();
    listfileContent("d:/f1",directoryFiles);
    System.out.println(directoryFiles.toString());
}

public static void listfileContent(String directoryName,Map<String,Map<String,String>> directoryFiles) {
    File directory = new File(directoryName);
    // get all the files from a directory
    File[] files = directory.listFiles();
    Map<String,String> fileNameAndContents = new HashMap<>();
    for (File file : files) {
        if (file.isFile()) {
            fileNameAndContents.put(file.getName(), "FileContent " );
            directoryFiles.put(directoryName, fileNameAndContents);

        } else if (file.isDirectory()) {
            listfileContent(file.getAbsolutePath(),directoryFiles);
        }
    }
}

我认为这会对你有所帮助。 “FileContent”可以编写一个函数来从文件中获取数据。

答案 1 :(得分:0)

你想要 - &#34;从hashmap中访问与特定键相关联的数组&#34;

当然,您不必每次都初始化ArrayList,而是可以随时替换此行 ArrayList<String> document_words_on_line = new ArrayList<String>();
 用这条线
ArrayList<String> document_words_on_line = fileDict.get(key_file_loke);
并在分配key_file_loke之前计算document_words_on_line

[更新]: 如果得到null然后初始化它,否则使用相同的引用。 简而言之 : String key_file_loke = Insert your existing logic; ArrayList<String> document_words_on_line = fileDict.get(key_file_loke); if(document_words_on_line == null){ ArrayList<String> document_words_on_line = new ArrayList<String>(); }

答案 2 :(得分:0)

首先,您可能想要替换这部分代码

if (file.isDirectory()) 
{
    iterateDirectory(directory, globo_dict_fixed, fileDict, GLOBO_DICT );
}
用fhis

if (file.isDirectory()) 
{
    iterateDirectory(file, globo_dict_fixed, fileDict, GLOBO_DICT );
}

接下来,在开始查找此目录中的单词之前,一旦找到新目录,就应该将新的键值对放入hashmap中。因此,您不需要为同一目录中的每个文件检查并创建新的List和键值对(假设您有一个包含大量文件的目录)。

例如

for (File file : directory.listFiles()) 
{
    if (file.isDirectory()) 
    {
        fileDict.put(getDirectoryName(file), new LinkedList<>());
        iterateDirectory(file, globo_dict_fixed, fileDict, GLOBO_DICT );
    } 
    else 
    {   
        final String directoryName = getDirectoryByFilePath(file); // you should extract this method from your code
        List<String> wordsList = fileDict.get(directoryName);
        if(wordsList == null) { // just in case
            wordsList = new LinkedList<>();
            fileDict.put(directoryName, wordsList);
        }

        String line; 
        BufferedReader br = new BufferedReader(new FileReader( file ));
        while((line = br.readLine()) != null) {
            String[] words = line.split(" ");//those are your words
            if(globo_dict_fixed == false)
            {
                Data_GloboPop.populate_globo_dict( words, GLOBO_DICT );
            }
            else
            {
                for (int i = 0; i < words.length; i++) 
                {
                        wordsList.add(words[i]);
                }
            }
        }
    }
}

如果您不关心通过随机索引访问单词,我建议使用LinkedList而不是ArrayList。