[英]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文件中選擇兩列,然后將它們添加到數據結構中。 我強調了單詞“ 二”,因為在地圖中,您有一個鍵和一個值。 一欄成為鍵,另一欄成為值。
您應該怎么做:
將要添加到數據結構中的列名稱導入兩個字符串。 (您可以從文件中讀取它們)。
使用您執行的CSVParser
類CSVParser
CSV文件。
將對應於第一所需列的值存儲在字符串中,重復對應於第二所需列的值,然后將它們都推入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;
}
另外,請注意,此數據集僅用於存儲一行。 為了存儲多行中的信息,您需要創建一個DataSet
的Linked 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.