Java 获取树映射的最后3个值

Java 获取树映射的最后3个值,java,treemap,Java,Treemap,我有一个日期/字符串树形图,我想循环浏览最后N个条目 TreeMap<Date,String> map = new TreeMap<Date,String>(); map.put(new Date(2011,1,1), "32,1"); map.put(new Date(2011,3,1), "35"); map.put(new Date(2011,4,5), "38,9"); map.put(new Date(2011,8,2), "57!!"); 有什么帮助吗?in

我有一个日期/字符串树形图,我想循环浏览最后N个条目

TreeMap<Date,String> map = new TreeMap<Date,String>();
map.put(new Date(2011,1,1), "32,1");
map.put(new Date(2011,3,1), "35");
map.put(new Date(2011,4,5), "38,9");
map.put(new Date(2011,8,2), "57!!");
有什么帮助吗?

inti=0;
int i=0;
for(Iterator<Date> it = dates.iterator(); it.hasNext() && i<3;) {
  Date date = it.next();
  doSomething();
  i++
}
for(Iterator it=dates.Iterator();it.hasNext()&&i
inti=0;

for(Iterator it=dates.Iterator();it.hasNext())&&iTreeMap to Array并读取带有条件i<3

的for循环的数组TreeMap to Array并读取带有条件i<3

的for循环的数组您关心树的状态吗?如果不关心,那么您可以这样做。这将删除树上的最后一个条目并将其提供给您。执行3次,您就完成了。或者您可以这样做将树展平到arrayList中,只返回最后3个元素。

您关心树的状态吗?如果不关心,那么您可以这样做。这将从树上删除最后一个条目并将其提供给您。执行3次,您就完成了。或者您可以将树展平到arrayList中,只返回最后3个元素。

听起来像是您st需要循环检查前三个项目:

    int i=0;
    for(Date date: dates){

        //Do something

        if(i++ > 2){
            break;
        }
    }

听起来您只需要循环浏览前三个项目:

    int i=0;
    for(Date date: dates){

        //Do something

        if(i++ > 2){
            break;
        }
    }

看起来您希望通过以下方式进行迭代:


看起来您希望通过以下方式进行迭代:

  • TreeMap实现了NavigableMap
  • NavigableMap.downingmap()
  • descending Map.entrySet().iterator()//前3个条目当然是 “最后3个”是因为它是背对背的
您只需实现Comparator并将其传递给TreeMap,这样“最早的”日期就位于TreeMap的开头。

  • TreeMap实现了NavigableMap
  • NavigableMap.downingmap()
  • descending Map.entrySet().iterator()//前3个条目当然是 “最后3个”是因为它是背对背的

您只需实现Comparator并将其传递给树状图,以便“最早”的日期位于树状图的顶部。

您需要在最后3个键的循环中以相反的顺序遍历地图。作为提醒,JDK date/calendar类使用wierd偏移量表示年份和月份(月份从0开始,而不是1,date类的年份由1900抵消)。如果这是您真正想要的,那没关系。但是,请记住,月份有预定义的常量(
Calendar.JANUARY
)(恐怕年份没有简单的帮助)。此外,该特定构造函数已被弃用(但仍然可以工作)。这种行为就是为什么有些人喜欢JodaTime库的原因……您需要在最后3个键的循环中以相反的顺序浏览地图。作为提醒,JDK date/calendar类对年和月使用wierd偏移量(月从0开始,而不是1,date类的年偏移量为1900)。如果这是您真正想要的,那没关系。但是,请记住,月份有预定义的常量(
Calendar.janur
)(恐怕这些年没有简单的帮助)。此外,该特定构造函数已被弃用(但仍应能工作)。这种行为就是为什么有些人喜欢JodaTime库…如果他在乎,他可以复制地图,然后按照你的建议去做。如果他在乎,他可以复制地图,然后按照你的建议去做。另外,你使用的是一个不推荐的
Date
构造函数;使用
Calendar.getInstance()
取而代之。我尝试使用日历而不是日期…似乎我很累。如何实例化6月3日?我尝试了c Calendar.getInstance();c.set(2011,6,3)…但我上面已经详细说明了没有办法;请注意,月份从0.Alos开始,
Map.Entry
提供了对键和值的访问。是的,
java.util.Date
中基于0的月份是切换到的最有力的理由之一,您使用的是一个不推荐的
Date
构造函数;使用
Calendar.getInstance()
取而代之。我尝试使用日历而不是日期…似乎我很累。如何实例化6月3日?我尝试了c Calendar.getInstance();c.set(2011,6,3)…但是我上面已经详细阐述了没有办法;请注意,月份从零开始。Alos,
Map.Entry
可以访问键和值。是的,
java.util.Date
中基于0的月份是切换到糟糕建议的最有力原因之一,有更好的方法。糟糕的建议,有更好的方法。
int i=0;
Iterator<Date> it = dates.iterator();
while(i<3 && it.hasNext()) {
  Date date = it.next();
  doSomething();
  i++
}
    int i=0;
    for(Date date: dates){

        //Do something

        if(i++ > 2){
            break;
        }
    }
private static final int N = 3;
...
int i = 0;
for (Map.Entry entry : map.descendingMap().entrySet()) {
    if (i++ < N) {
        System.out.println(entry);
    }
}
Fri Sep 02 11:39:05 EDT 2011=57!! Thu May 05 11:39:05 EDT 2011=38,9 Fri Apr 01 11:39:05 EDT 2011=35
private static Date createDate(int year, int month, int day) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(year, month, day);
    return calendar.getTime();
}
...
map.put(createDate(2011, 5, 3), "3-Jun-2011");