Search code examples
javahashtable

read txt file and store data in a hashtable in java


I am reading a txt file and store the data in a hashtable, but I couldn't get the correct output. the txt file like this (part) attached image this is part of my data

And I want to store the column 1 and column 2 as the key(String type) in hashtable, and column 3 and column 4 as the value (ArrayList type) in hashtable. My code below:

private Hashtable<String, ArrayList<String[]>> readData() throws Exception {
    BufferedReader br = new BufferedReader (new FileReader("MyGridWorld.txt"));
    br.readLine();

    ArrayList<String[]> value = new ArrayList<String[]>();
    String[] probDes = new String[2];
    String key = "";

    //read file line by line
    String line = null;
    while ((line = br.readLine()) != null && !line.equals(";;")) {
        //System.out.println("line ="+line);
        String source;
        String action;

        //split by tab
        String [] splited = line.split("\\t"); 
        source = splited[0];
        action = splited[1];
        key = source+","+action;

        probDes[0] = splited[2];
        probDes[1] = splited[3];

        value.add(probDes);
        hashTableForWorld.put(key, value);
        System.out.println("hash table is like this:" +hashTableForWorld);

    }

    br.close();
    return  hashTableForWorld;


}

The output looks like this: it's a very long long line

I think maybe the hashtable is broken, but I don't know why. Thank you for reading my problem.


Solution

  • You should change your logic for adding to your hashtable to check for the key you create. If the key exists, then grab your array list of arrays that it maps to and add your array to it. Currently you will overwrite the data.

    Try this

    if(hashTableForWorld.containsKey(key))
    {
        value = hashTableForWorld.get(key);
        value.add(probDes);
        hashTableForWorld.put(key, value);
    }
    else
    {
        value = new ArrayList<String[]>();
        value.add(probDes);
        hashTableForWorld.put(key, value);
    }
    

    Then to print the contents try something like this

    for (Map.Entry<String, ArrayList<String[]>> entry : hashTableForWorld.entrySet()) {
        String key = entry.getKey();
        ArrayList<String[]> value = entry.getValue();
    
        System.out.println ("Key: " + key + " Value: ");
        for(int i = 0; i < value.size(); i++)
        {
            System.out.print("Array " + i + ": ");
            for(String val : value.get(i))
                System.out.print(val + " :: ")
            System.out.println();
        }
    }