[英]HashMap/TreeMap sorting my keys
使用JSoup,我正在從一個提供花粉數據的網站上抓取一些數據。 他們沒有API訪問權限,所以抓取是我的最后選擇。
使用HashMap
,我存儲date
和pollenIndex
,這是當天花粉水平高到pollenIndex
的范圍。
private static Map<String, String> pollenMap = new HashMap<String, String>();
這是我的Pollen
類的構造函數的一部分。
for(int i = 0; i < 4; i++)
{
Element dates = doc.select("td.text-center.even-four").get(i);
Element levels = doc.select("td.levels").get(i);
System.out.println(dates.text() + ", " + levels.text());
pollenMap.put(dates.text(), levels.text());
}
一個問題是HashMap
為我排序數據。 pollenMap
的輸出是這樣的:
: [Monday May 26, 2014, Wednesday May 28, 2014, Sunday May 25, 2014, Tuesday May 27, 2014]
: [7.90, 6.60, 7.60, 8.80]
如您所見, HashMap
我的dates
鍵進行排序,導致Monday
排在第一位, Tuesday
最后。
我可能沒有正確使用HashMap
,所以我的朋友建議我使用TreeMap
,但是結果是這樣的:
: [Monday May 26, 2014, Wednesday May 28, 2014, Sunday May 25, 2014, Tuesday May 27, 2014]
: [7.90, 6.60, 7.60, 8.80]
如何在不對其進行排序的情況下使用此鍵值結構?
對於這個數據結構的新手問題深表歉意。 我可以使用兩個String
列表,但是我想學習這些新的數據結構。
(1) java.util.HashMap
不保證順序。
(2) java.util.SortedMap
(例如java.util.TreeMap
按鍵排序。 (在您的情況下,按字典順序對String
鍵進行排序。)
如何在不對其進行排序的情況下使用此鍵值結構?
如果要按插入鍵值的順序迭代鍵值,則需要java.util.LinkedHashMap
。
此實現與HashMap的不同之處在於,它維護貫穿其所有條目的雙向鏈接列表。 此鏈表定義了迭代順序,通常是將鍵插入映射的順序(插入順序)。
OP不想保留插入順序。 他/她想要日期順序。
如果要按日期順序遍歷鍵值,請使用java.util.TreeMap
,但將String
解析為Date
。
SimpleDateFormat format = new SimpleDateFormat("EEEEE MMMM d, yyyy");
for(int i = 0; i < 4; i++)
{
Element dates = doc.select("td.text-center.even-four").get(i);
Element levels = doc.select("td.levels").get(i);
System.out.println(dates.text() + ", " + levels.text());
pollenMap.put(format.parse(dates.text()), levels.text());
}
順便說一句,您可能希望對測量進行相同的操作,並將它們存儲為long
或java.math.BigDecimal
。
HashMap
不對數據排序; 哈希鍵將數據分配給存儲桶! 您可以創建鍵值類型並將數據存儲在List
或Stack
。 他們將保留您的廣告訂單。
您的問題是您正在使用String
值來存儲日期和小數。 當您進行排序時,您的日期將按字母順序進行排序,在這種情況下,將星期一放在星期六之前,依此類推。
由於要在地圖中存儲日期數據和十進制數據,因此應將其設置為TreeMap<Date,BigDecimal>
而不是TreeMap<String,String>
。 解析您的日期和小數,然后再將其放入地圖。 然后, TreeMap
代碼將對它們正確排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.