多维可查询HashMap数组

时间:2013-11-29 14:49:03

标签: java arrays csv multidimensional-array openjdk

我有一个CSV文件,我想将其存储为Java对象。我希望列的名称是数组的第一个维度,键对值是数组的第二个维度。我尝试了不同的解决方案(主要是LinkedHashMaps),但似乎都没有正常工作。

CSV看起来像这样:

TimeStamp;Column 1;Column 2;Column3
1385733406;Value1;Value12;Value13
1385733409;Value21;Value22;Value23
1385733411;Value31;Value32;Value33

我希望数组看起来像这样:

["Column 1"]
    ["1385733406","Value1"]
    ["1385733409","Value21"]
    ["1385733411","Value31"]
["Column 2"]
    ["1385733406","Value2"]
    ["1385733409","Value22"]
    ["1385733411","Value32"]
["Column 3"]
    ["1385733406","Value2"]
    ["1385733409","Value22"]
    ["1385733411","Value33"]

这样,我就可以查询对象并从给定列中检索所有密钥对值,例如,第1列中的所有数据。使用HashMaps似乎不起作用,因为它们需要两个参数,这样做似乎不是正确的方法。这是我到目前为止可以提出的代码,我认为这不是正确的轨道,但这是我能想到的。我正在使用OpenJDK 1.7

public class CsvCollection {
    public Map<String,Map<String,Integer>> Results = new LinkedHashMap<String, Map<String,Integer>>();

    public CsvCollection(){

    }

    public void parseCsvResultFile(File csvFile){       
        CSVReader reader = null;
        List myEntries = null;
        try {
            reader = new CSVReader(new FileReader(csvFile.getAbsolutePath()), ';');
        } catch (FileNotFoundException e) {
            System.out.println("Error opening [], aborting parsing");
        }
        try {
            myEntries = reader.readAll();
        } catch (IOException e) {
            System.out.println("Error reading content of CSV file (but file was opened)");
        }

        for(String header: (String[]) myEntries.get(0)){
            Results.put(header, null);
            // What now?
        }       
    }
}

1 个答案:

答案 0 :(得分:2)

您可以按如下方式进行2次更改,以实现您需要的功能。

1)更改以下代码

public Map<String,Map<String,Integer>> Results = new LinkedHashMap<String, Map<String,Integer>>();

public Map<String, List<String[]>> Results = new LinkedHashMap<String, List<String[]>>();

进行此更改是因为对于指定列,例如第1列,它有3行时间戳和相应的列值。您需要使用List来存储它们。

2)更改以下for循环

   for(String header: (String[]) myEntries.get(0)){
        Results.put(header, null);
        // What now?
    } 

    String[] headerColumns = (String[]) myEntries.get(0);
    // First column is TimeStamp, skip it
    for (int i = 1; i < headerColumns.length; i++) {

        List<String[]> list = new ArrayList<String[]>();
        for (int rowIndex = 1; rowIndex < myEntries.size(); rowIndex++) {
            String[] row = (String[]) myEntries.get(rowIndex);
            list.add(new String[] { row[0], row[i] });
        }

        Results.put(headerColumns[i], list);
    }

通过以上2次更改,如果您使用以下代码在控制台中打印结果(Map&lt; String,List&lt; String []&gt;&gt;的类型),

   for(Map.Entry<String, List<String[]>> entry : Results.entrySet())
    {
        System.out.printf("[%s]\n",entry.getKey());
        for(String[] array : entry.getValue())
        {
            System.out.println(Arrays.toString(array));
        }
    }

您将获得所需的结果:

[Column 1]
[1385733406, Value1]
[1385733409, Value21]
[1385733411, Value31]
[Column 2]
[1385733406, Value12]
[1385733409, Value22]
[1385733411, Value32]
[Column3]
[1385733406, Value13]
[1385733409, Value23]
[1385733411, Value33]

注意:上面的示例是使用以下CSV文件中的内容执行的:

TimeStamp;Column 1;Column 2;Column3
1385733406;Value1;Value12;Value13
1385733409;Value21;Value22;Value23
1385733411;Value31;Value32;Value33