Java读取文本文件存储到HashMap

Java读取文本文件存储到HashMap,java,hashmap,text-files,Java,Hashmap,Text Files,我只是想知道这个逻辑是否可行,我想做的是逐行读取文本文件并将其存储到HashMap。我想将前4行存储到hashMap的key中,当这些行读取检查点时,下一行将存储到hashMap的value中 File file1 = new File("C:\test\testfolder\test.txt"); HashMap<String,String> hashMap = new HashMap(); String check = "checkpointone"; try{ Li

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

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();
}

将检查点之前的行存储在列表中。在检查点之后,将每一行插入hashmap,使用列表中的每一项作为键

...
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);
    }
}
...
。。。
布尔pastCheckpoint=false;
int-keyIndex=0;
//我们将把钥匙存放在这里
列表键=新的ArrayList();
while(it.hasNext()){
line=it.nextLine();
如果(行包含(检查)){
//我们实际上不想储存这一行,
//那就把旗子挂起来吧
pastCheckpoint=true;
}
else if(过去检查点){
//我们必须已经定义了一个密钥
//取下那把钥匙,为下次增加计数器
hashMap.put(keys.get(keyIndex++),line);
}
否则{
//我们还没有通过检查点,请保存此密钥以备将来使用
键。添加(行);
}
}
...

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

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

应该是

if(hashMap.contains(check))

然后,您可以在到达检查点后中断循环,如果这是您的意图的话。否则,您可以让循环继续。

@deyur建议的方法非常有效,我们可以使用一个列表来跟踪向地图添加关键点的顺序。但有一种数据结构支持这种功能:


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

将检查点之前的行存储在列表中。在检查点之后,将每一行插入hashmap,使用列表中的每一项作为键。@chengpohi,他说“我想将前4行存储到hashmap的键中”。这对我很有用!是的,这个不能处理任何情况。但是我的文本文件有精确的键和值。非常感谢。代码之间的解释太棒了。如果还有第二个检查点和第三个检查点呢?但逻辑是一样的。当line读取checkpoint two时,checkpoint two下的第一行被放在键上,当checkpoint two下读取checkpoint two的行将被存储到valuesYes时,这也会起作用,但实际上并不需要。第一个列表是必需的,因为您需要在存储值时知道密钥,所以它必须已经可用。虽然有两个列表并从这两个列表中构建地图可能更具可读性。我如何才能做到这一点?例如,我有这样的
test1test2test3checkpointone get1get2get3checkpointtwo test4test5test6checkpointthreeget4get5get6
噢,我明白你的意思了。如果你点击了第二个检查点,从密钥列表中删除所有内容。您需要将“检查点”的测试更改为同时考虑检查点1和检查点3。老实说,这是一种非常奇怪的读取多个值的方法。最好让输入文件是一个逗号分隔的键值对列表,每行一个。
if(hashMap.contains(check))