使用JSoup我正在从网站上抓取一些数据,这些数据可以提供花粉数据。他们没有API访问权限,所以抓取是我最后的手段。
使用HashMap
,我会存储date
和pollenIndex
,这是当天花粉水平的高度,范围为0.0 - 10.0。
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
列表,但我想学习这些新的数据结构。
答案 0 :(得分:4)
(1)java.util.HashMap
不保证订单。
(2)java.util.SortedMap
,例如java.util.TreeMap
按键排序。 (在您的情况下,按字典顺序对String
键进行排序。)
如何在不对其进行排序的情况下使用此键值结构?
如果您想按插入顺序迭代键值,则需要java.util.LinkedHashMap
。
这个实现与HashMap的不同之处在于它维护着一个运行所有条目的双向链表。此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序)。
OP并不想保留广告订单。他/她想要日期订单。
如果您想按日期顺序迭代键值,请使用java.util.TreeMap
,parse String
到Date
。< / p>
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
s。
答案 1 :(得分:2)
HashMap
不对数据进行排序;它哈希键将数据分配给桶!您可以创建键值类型,并将数据存储在List
或Stack
中。它们将保留您的广告订单。
答案 2 :(得分:0)
您的问题是您使用String
值来存储日期和小数。当您排序时,您的日期将按字母顺序排序,在这种情况下,星期一在星期六之前,依此类推。
由于您要在地图中存储日期数据和小数数据,因此应将其设为TreeMap<Date,BigDecimal>
而不是TreeMap<String,String>
。在将它们放入地图之前解析您的日期和小数。然后TreeMap
代码会正确排序。