Java将文本文件存储到HashMap

时间:2015-06-29 00:44:57

标签: java hashmap text-files

我只是想知道这个逻辑是否可行,我想要做的是逐行读取文本文件并将其存储到HashMap。我想将前4行存储到hashMap的键中,当行读取检查点时,下一行将存储到HashMap的值。

File file1 = new File("C:\test\testfolder\test.txt");

HashMap<String,String> hashMap = new HashMap();
String check = "checkpointone";

try{
    LineIterator it = FileUtils.lineIterator(file1,"UTF-8");

    String line;

    while(it.hasNext()){
        line = it.nextLine();
        hashMap.put(line , null);

        if(line.contains(check)){
            //do the logic here
        }
    }
}
catch(Exception ex){
    ex.printStackTrace();
}

test.txt数据:

test1
test2
test3
test4
checkpointone
get1
get2
get3
get4

3 个答案:

答案 0 :(得分:2)

将检查点之前的行存储在列表中。在检查点之后,将每行插入到散列映射中,使用列表中的每个项作为键。

...
boolean pastCheckpoint = false;
int keyIndex = 0;
// We will store keys in here
List<String> keys = new ArrayList<String>();

while(it.hasNext()){
    line = it.nextLine();

    if (line.contains(check)) {
        // We don't actually want to store this line,
        // so just set the flag 
        pastCheckpoint = true;
    }
    else if (pastCheckpoint) {
        // We must already have a key defined
        // Get that key and increment the counter for next time
        hashMap.put(keys.get(keyIndex++), line);
    }
    else {
        // We're not past the checkpoint so save this key for later
        keys.add(line);
    }
}
...

请注意,这不会处理输入文件格式错误的情况(例如,值多于键会导致IndexOutOfBoundsException)。

答案 1 :(得分:0)

这种逻辑是可能的。但是,迭代器及其子类没有contain()函数。

应该是

if(hashMap.contains(check))

然后,一旦达到检查点,你可以突破循环,如果这是意图。否则,您可以继续循环。

答案 2 :(得分:0)

@deyur建议的工作完全正常,我们可以使用List来跟踪键添加到Map的顺序。但是有一种支持这种能力的数据结构:

我假设您希望您的键值类似于(test1,get1),(test2,get2)等。您的代码首先将(test1,null),(test2,null)等放入HashMap中。到达检查点时,您需要知道添加到HashMap的第一个条目是什么,以便将其值设置为checkpoint之后的第一行。现在,您的问题是在HashMap中准确检索键值。与放在地图中的顺序相同并更新其值。这在HashMap中是不可能的。相反,您可以使用支持此类功能的LinkedHashMap