比较Hashmap中的键

时间:2016-07-07 06:09:12

标签: java csv hashmap

我有一个test.csv文件格式为:

Home,Owner,Lat,Long
5th Street,John,5.6765,-6.56464564
7th Street,Bob,7.75,-4.4534564
9th Street,Kyle,4.64,-9.566467364
10th Street,Jim,14.234,-2.5667564

我有一个散列图,它读取的文件包含相同的标题内容,例如CSV,只是一种不同的格式,没有附带的数据。

例如:

Map<Integer, String> container = new HashMap<>();

其中,

键,值

[0][NULL]
[1][Owner]
[2][Lat]
[3][NULL]

我还创建了第二个哈希映射:

BufferedReader reader = new BufferedReader (new FileReader("test.csv"));
CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT);
Boolean headerParsed = false;
CSVRecord headerRecord = null;
int i;
Map<String,String> value = new HashMap<>();
for (final CSVRecord record : parser) {
    if (!headerParsed = false) {
     headerRecord = record;
     headerParsed = true;
    }
    for (i =0; i< record.size(); i++) {
        value.put (headerRecord.get(0), record.get(0));
    }
}

我想读取并比较hashmap,如果容器映射具有值map中的值,那么我将该值放入相应的对象中。

示例对象

public DataSet (//args) {
    this.home
    this.owner
    this.lat
    this.longitude
}

我想创建一个函数,在比较散列图时,当值映射键等于包含映射键时,在对象内部设置数据,并将放置的值设置到对象中。在处理设置方面也非常简单。

请注意:我制作了CSV标题和行有限,在现实生活中,CSV可以有x个字段(Home,Owner,Lat,Long,houseType,houseColor等等),以及一些与这些字段相关联的值

1 个答案:

答案 0 :(得分:0)

首先,您解决此问题的方法过于漫长。从我看到的,你要做的就是:

从CSV文件中选择两个列,并将它们添加到数据结构中。我突出显示了 two 这个词,因为在地图中,你有一个键和一个值。一列成为键,另一列成为值。

你应该做什么:

  1. 将要添加到数据结构中的列的名称导入两个字符串。 (您可以从文件中读取它们。)

  2. 使用您所做的CSVParser课程迭代CSV文件。

  3. 将对应于第一个所需列的值存储在字符串中,使用与第二个所需列对应的值重复,并将它们都推入DataSet对象,然后按{{1}将对象转换为DataSet

  4. 如果您愿意坚持解决问题的方法:

    基本上,空文件应该只包含标题(列名),这就是你为什么命名相应的哈希映射List<DataSet>的原因。第二个文件应该包含值,因此您命名了相应的哈希映射containers

    首先,你说的地方

    values
    你可能想说

    if (!headerParsed = false) {
        headerRecord = record;
        headerParsed = true;
    }
    

    和你说的地方

    if (!headerParsed) {
        headerRecord = record;
        headerParsed = true;
    }
    
    你可能意味着

    for (i =0; i< record.size(); i++) {
        value.put(headerRecord.get(0), record.get(0));
    }
    

    即。您迭代一条记录并存储与for (i =0; i< record.size(); i++) { value.put(headerRecord.get(i), record.get(i)); } 对应的value

    现在我还没有在我的桌面上尝试过这段代码,但由于for循环也遍历Home和Longitude,我认为它应该会产生错误,你应该在调用column之前添加额外的检查(即value.put应该创建一个我想的错误)。将其包裹在value.put("Home", "5th Street")条件内,并检查容器哈希映射中是否存在if

    headerRecord(i)

    现在的情况是,数据结构本身取决于您要存储的容器哈希映射中的哪些值。它可能是Home和Lat,或者所有者和Long。所以我们被困住了。你如何创建如下的数据结构:

    for (i =0; i< record.size(); i++) {
        if (container[headerRecord.get(i)] != NULL) {
            value.put(headerRecord.get(i), record.get(i));
        }
    }
    

    另请注意,此DataSet仅用于存储一行。要存储多行信息,您需要创建struct DataSet { string val1; string val2; } Linked List

    最后,容器文件包含所有列名。并非所有这些列都将存储在数据集中(即,您选择了NULL Home和Long。您可以选择NULL Owner和Lat),因此头文件不是您做出此决定所需的。

    如果您考虑一下,只需迭代值哈希映射并将第一个值存储在字符串DataSet中,将第二个值存储在val1中。

    val2

    我希望这会有所帮助。