簡體   English   中英

比較哈希圖中的鍵

[英]Comparing Keys in a 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));
    }
}

我想閱讀並比較哈希圖,如果容器映射具有值映射中的值,則將該值放入相應的對象中。

示例對象

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

我想創建一個函數,在比較哈希圖時,當值映射鍵等於包含映射鍵,並且將值放置到對象中時,將數據設置在對象內部。 確實很簡單的方法也可以有效地處理設置。

請注意:在現實生活中,我使CSV標頭和行是有限的,CSV可能具有x個字段(Home,Owner,Lat,Long,houseType,houseColor等),以及與那些領域

首先,您解決此問題的方法太長了。 從我看來,您要做的就是:

從CSV文件中選擇列,然后將它們添加到數據結構中。 我強調了單詞“ 二”,因為在地圖中,您有一個鍵和一個值。 一欄成為鍵,另一欄成為值。

您應該怎么做:

  1. 將要添加到數據結構中的列名稱導入兩個字符串。 (您可以從文件中讀取它們)。

  2. 使用您執行的CSVParserCSVParser CSV文件。

  3. 將對應於第一所需列的值存儲在字符串中,重復對應於第二所需列的值,然后將它們都推入DataSet對象,然后將DataSet對象推入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));
}

即,您遍歷一條記錄並存儲與每一column相對應的value

現在,我還沒有在桌面上嘗試此代碼,但是由於for循環還會在Home和Longitude上進行迭代,因此我認為它應該會產生錯誤,並且在調用value.put (即value.put("Home", "5th Street")應該會產生一個錯誤(我想)。 if有條件則將其包裝,並檢查headerRecord(i)甚至存在於容器哈希圖中。

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

現在的事情是,數據結構本身取決於您要存儲的容器哈希映射中的哪些值。 它可以是Home and Lat,也可以是Owner and Long。 所以我們被困住了。 如何創建如下所示的數據結構:

struct DataSet {
    string val1;
    string val2;
}

另外,請注意,此數據集僅用於存儲一行。 為了存儲多行中的信息,您需要創建一個DataSetLinked List

最后,容器文件包含所有列名稱。 並非所有這些列都將存儲在數據集中(即,您選擇了NULL Home和Long。您可能選擇了NULL Owner和Lat),因此,頭文件不是您做出此決定所需要的。

如果您考慮一下,只需遍歷值哈希映射並將第一個值存儲在字符串val1 ,將第二個值存儲在val2

List<DataSet> myList;
DataSet row;

Iterator it = values.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry pair = (Map.Entry)it.next();

    row.val1 = pair.getKey();
    row.val2 = pair.getValue();
    myList.add(row);
    it.remove();
}

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM