Java HashMap/TreeMap对我的键进行排序

Java HashMap/TreeMap对我的键进行排序,java,data-structures,hashmap,treemap,Java,Data Structures,Hashmap,Treemap,使用JSoup,我从一个提供花粉数据的网站上抓取了一些数据。他们没有API访问权限,所以刮削是我最后的选择 使用HashMap,我存储date和pollenIndex,这是当天花粉水平的高低,以0.0-10.0为刻度 private static Map<String, String> pollenMap = new HashMap<String, String>(); 一个问题是HashMap为我排序数据。pollenMap的输出如下: : [Monday May

使用JSoup,我从一个提供花粉数据的网站上抓取了一些数据。他们没有API访问权限,所以刮削是我最后的选择

使用
HashMap
,我存储
date
pollenIndex
,这是当天花粉水平的高低,以0.0-10.0为刻度

private static Map<String, String> pollenMap = new HashMap<String, String>();
一个问题是
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
排在第一位,而
周二
排在最后

我可能错误地使用了
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
列表,但我想学习这些新的数据结构。

HashMap
不会对数据进行排序;它散列键以将数据分配给bucket!您可以创建键值类型并将数据存储在
列表
堆栈
中。它们将保留您的插入顺序

HashMap
不会对数据进行排序;它散列键以将数据分配给bucket!您可以创建键值类型并将数据存储在
列表
堆栈
中。它们将保留您的插入顺序

(1)
java.util.HashMap
不保证顺序

(2)
java.util.SortedMap
,例如
java.util.TreeMap
按键排序。(在本例中,按字典顺序对
字符串
键进行排序。)


如何在不排序的情况下使用此键值结构

如果要按照插入键值的顺序迭代键值,则需要

此实现与HashMap的不同之处在于,它维护一个贯穿其所有条目的双链接列表。此链表定义了迭代顺序,通常是将关键帧插入贴图的顺序(插入顺序)


OP不想保留插入顺序。他/她想要定购日期

如果要按日期顺序迭代键值,请使用
java.util.TreeMap
,但要使用
字符串
s到
Date
s

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());
}
SimpleDateFormat格式=新的SimpleDateFormat(“EEEEE MMMM d,yyyy”);
对于(int i=0;i<4;i++)
{
元素日期=doc.select(“td.text center.偶数四”).get(i);
元素级别=文档选择(“td.levels”).get(i);
System.out.println(dates.text()+“,”+levels.text());
put(format.parse(dates.text()),levels.text());
}
顺便说一句,您可能希望对测量值执行相同的操作,并将它们存储为
long
s或
java.math.BigDecimal
s。

(1)
java.util.HashMap
不保证顺序

(2)
java.util.SortedMap
,例如
java.util.TreeMap
按键排序。(在本例中,按字典顺序对
字符串
键进行排序。)


如何在不排序的情况下使用此键值结构

如果要按照插入键值的顺序迭代键值,则需要

此实现与HashMap的不同之处在于,它维护一个贯穿其所有条目的双链接列表。此链表定义了迭代顺序,通常是将关键帧插入贴图的顺序(插入顺序)


OP不想保留插入顺序。他/她想要定购日期

如果要按日期顺序迭代键值,请使用
java.util.TreeMap
,但要使用
字符串
s到
Date
s

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());
}
SimpleDateFormat格式=新的SimpleDateFormat(“EEEEE MMMM d,yyyy”);
对于(int i=0;i<4;i++)
{
元素日期=doc.select(“td.text center.偶数四”).get(i);
元素级别=文档选择(“td.levels”).get(i);
System.out.println(dates.text()+“,”+levels.text());
put(format.parse(dates.text()),levels.text());
}

顺便说一句,您可能希望对测量值执行相同的操作,并将它们存储为
long
s或
java.math.BigDecimal
s。

您的问题是使用
String
值来存储日期和小数。当你排序时,你的日期是按字母顺序排序的,在本例中是把星期一放在星期六之前,依此类推


由于要在地图中存储日期数据和十进制数据,因此应将其设置为
TreeMap
,而不是
TreeMap
。在将日期和小数放入地图之前,先分析它们。
TreeMap
代码将正确地对它们进行排序。

您的问题是使用
字符串
值来存储日期和小数。当你排序时,你的日期是按字母顺序排序的,在本例中是把星期一放在星期六之前,依此类推


由于要在地图中存储日期数据和十进制数据,因此应将其设置为
TreeMap
,而不是
TreeMap
。在将日期和小数放入地图之前,先分析它们。
TreeMap
代码将正确地对它们进行排序。

哦,我道歉。这是否意味着我不正确地使用了
HashMap
?还是只是让你感到惊讶?通常,当您需要键值映射时,键值对的顺序并不重要。
TreeMap
上的迭代顺序取决于用作键的对象的类型。您还可以提供一个自定义的
比较器
,以影响订单。我的猜测是,您的问题源于用作键的字符串的格式,以及缺少能够以您想要的方式对它们进行比较的合理函数。你最好离开帕斯