HashMap / TreeMap排序我的键

时间:2014-05-25 20:31:52

标签: java data-structures hashmap treemap

使用JSoup我正在从网站上抓取一些数据,这些数据可以提供花粉数据。他们没有API访问权限,所以抓取是我最后的手段。

使用HashMap,我会存储datepollenIndex,这是当天花粉水平的高度,范围为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列表,但我想学习这些新的数据结构。

3 个答案:

答案 0 :(得分:4)

(1)java.util.HashMap不保证订单。

(2)java.util.SortedMap,例如java.util.TreeMap按键排序。 (在您的情况下,按字典顺序对String键进行排序。)


  

如何在不对其进行排序的情况下使用此键值结构?

如果您想按插入顺序迭代键值,则需要java.util.LinkedHashMap

  

这个实现与HashMap的不同之处在于它维护着一个运行所有条目的双向链表。此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序)。


  

OP并不想保留广告订单。他/她想要日期订单。

如果您想按日期顺序迭代键值,请使用java.util.TreeMapparse StringDate。< / 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());
}

顺便说一句,您可能希望对测量进行相同的操作,并将其存储为longjava.math.BigDecimal s。

答案 1 :(得分:2)

HashMap不对数据进行排序;它哈希键将数据分配给桶!您可以创建键值类型,并将数据存储在ListStack中。它们将保留您的广告订单。

答案 2 :(得分:0)

您的问题是您使用String值来存储日期和小数。当您排序时,您的日期将按字母顺序排序,在这种情况下,星期一在星期六之前,依此类推。

由于您要在地图中存储日期数据和小数数据,因此应将其设为TreeMap<Date,BigDecimal>而不是TreeMap<String,String>。在将它们放入地图之前解析您的日期和小数。然后TreeMap代码会正确排序。