java中基于日期间隔的子列表
我有一个名为Rating的课程,如下所示:java中基于日期间隔的子列表,java,list,datetime,collections,sublist,Java,List,Datetime,Collections,Sublist,我有一个名为Rating的课程,如下所示: import java.util.Date; public class Rating implements Comparable<Rating> { private long userId; private long itemId; private float ratingValue; private Date dateTime; public Rating(long userId, long itemId, float rating
import java.util.Date;
public class Rating implements Comparable<Rating> {
private long userId;
private long itemId;
private float ratingValue;
private Date dateTime;
public Rating(long userId, long itemId, float ratingValue, Date dateTime) {
this.userId = userId;
this.itemId = itemId;
this.ratingValue = ratingValue;
this.dateTime = dateTime;
}
@Override
public String toString() {
return "Rating{" +
"userId=" + userId +
", itemId=" + itemId +
", ratingValue=" + ratingValue +
", dateTime=" + dateTime +
'}';
}
public Date getDateTime() {
return dateTime;
}
public long getUserId() {
return userId;
}
public void setUserId(long userId) {
this.userId = userId;
}
public long getItemId() {
return itemId;
}
public void setItemId(long itemId) {
this.itemId = itemId;
}
public float getRatingValue() {
return ratingValue;
}
public void setRatingValue(float ratingValue) {
this.ratingValue = ratingValue;
}
public void setDateTime(Date datetime) {
this.dateTime = datetime;
}
@Override
public int compareTo(Rating o) {
return getDateTime().compareTo(o.getDateTime());
}
我想做的是在某些特定日期内(例如从4月到5月的收视率)查找myList的子列表 我想你应该用它来存储时间戳。您可以使用Date类中的函数进行转换。如果按unix时间戳升序排序,则首先得到最早的日期。希望这会有所帮助。我想你应该用它来存储时间戳。您可以使用Date类中的函数进行转换。如果按unix时间戳升序排序,则首先得到最早的日期。希望这会有所帮助。如果您使用的是Java 8(而且您应该使用Java 8:>),请使用流语法:
result = myList.stream().filter(x -> x.getDateTime() != null && x.getDateTime().compareTo(earlierDate) >= 0 && x.getDateTime().compareTo(laterDate) <= 0).collect(Collectors.toList());
result=myList.stream().filter(x->x.getDateTime()!=null&&x.getDateTime().compareTo(earlierDate)>=0&&x.getDateTime().compareTo(laterDate)如果您使用的是Java 8(并且应该使用Java 8:>),请使用流语法:
result = myList.stream().filter(x -> x.getDateTime() != null && x.getDateTime().compareTo(earlierDate) >= 0 && x.getDateTime().compareTo(laterDate) <= 0).collect(Collectors.toList());
result=myList.stream().filter(x->x.getDateTime()!=null&&x.getDateTime().compareTo(earlierDate)>=0&&x.getDateTime().compareTo(laterDate)您可以尝试像这样检查范围并将其添加到子列表中:
//Range values for date
Date startDate=new Date("06/01/2007");
Date endDate=new Date("07/01/2007");
ArrayList<Rating> sublist=new ArrayList<Rating>();
//check if list date comes in the range , If true add to sublist else not
boolean result=false;
for(int i=0;i<myList.size();i++)
{
result=!(myList.get(i).getDateTime().before(startDate) || myList.get(i).getDateTime().after(endDate));
if(result)
sublist.add(myList.get(i));
}
for(int i=0;i<sublist.size();i++)
{
System.out.println(sublist.get(i).toString());
}
//日期的范围值
开始日期=新日期(“2007年1月6日”);
日期endDate=新日期(“2007年1月7日”);
ArrayList子列表=新的ArrayList();
//检查列表日期是否在范围内,如果为真,则添加到子列表,否则不
布尔结果=假;
对于(int i=0;i您可以尝试像这样检查范围并将其添加到子列表中:
//Range values for date
Date startDate=new Date("06/01/2007");
Date endDate=new Date("07/01/2007");
ArrayList<Rating> sublist=new ArrayList<Rating>();
//check if list date comes in the range , If true add to sublist else not
boolean result=false;
for(int i=0;i<myList.size();i++)
{
result=!(myList.get(i).getDateTime().before(startDate) || myList.get(i).getDateTime().after(endDate));
if(result)
sublist.add(myList.get(i));
}
for(int i=0;i<sublist.size();i++)
{
System.out.println(sublist.get(i).toString());
}
//日期的范围值
开始日期=新日期(“2007年1月6日”);
日期endDate=新日期(“2007年1月7日”);
ArrayList子列表=新的ArrayList();
//检查列表日期是否在范围内,如果为真,则添加到子列表,否则不
布尔结果=假;
对于(inti=0;i您有几个选项
如果您有一个列表,无论是否排序,您都可以通过遍历列表并选择范围内的元素来构建子列表。子列表将与原始列表断开连接,并且操作必须将每个元素与选择范围进行比较。
在Java8中,可以使用流简化该过程
如果您有一个排序数组(不是列表),则可以对范围的起始值和结束值执行二进制搜索。然后可以从数组的子范围创建一个列表。同样,子列表将与原始数组断开连接,但范围查找速度更快(O(log(n))
vsO(n)
)
如果您有一个已排序的列表,您可以通过遍历列表找到范围的开始和结束位置,但在到达范围的末尾时停止(短路),然后使用subList()
。然后,子列表是一个视图,因此任何一个列表中的更改都会反映在另一个列表中
如果实际上不需要排序列表,可以构建一个TreeMap
,并调用subMap()
。与选项3类似,它提供了地图的视图
如果评级列表可以更改,选项4可能是最好的选择。您有几个选项
如果您有一个列表,无论是否排序,您都可以通过遍历列表并选择范围内的元素来构建子列表。子列表将与原始列表断开连接,并且操作必须将每个元素与选择范围进行比较。
在Java8中,可以使用流简化该过程
如果您有一个排序数组(不是列表),则可以对范围的起始值和结束值执行二进制搜索。然后可以从数组的子范围创建一个列表。同样,子列表将与原始数组断开连接,但范围查找速度更快(O(log(n))
vsO(n)
)
如果您有一个已排序的列表,您可以通过遍历列表找到范围的开始和结束位置,但在到达范围的末尾时停止(短路),然后使用subList()
。然后,子列表是一个视图,因此任何一个列表中的更改都会反映在另一个列表中
如果实际上不需要排序列表,可以构建一个TreeMap
,并调用subMap()
。与选项3类似,它提供了地图的视图
如果评级列表可以更改,选项4可能是最好的。这不是我的问题。我知道如何对具有日期的对象列表进行排序。我的问题是如何根据排序列表中对象的日期值获取此列表的子列表。例如,类似mylist.sublist.from(四月、五月)的内容(顺便说一句,这不是一个真正的代码)一旦您有了unix时间格式的日期,您所要做的就是查找范围内的所有数字。例如,2016年4月1日至2016年6月1日之间的日期将是范围内的所有数字-(1459483200,1464753600)这不是我的问题。我知道如何对具有日期的对象列表进行排序。我的问题是如何根据已排序列表中对象的日期值获取此列表的子列表。例如类似mylist.sublist.from(April,May)(顺便说一句,这不是真正的代码)一旦您将日期设置为unix时间格式,您所要做的就是查找范围内的所有数字。例如,2016年4月1日至2016年6月1日之间的日期将是范围内的所有数字-(1459483200、1464753600)。此外,一个很好的功能是,您可以通过在过滤器之后插入。sorted(yourcomarator)
,对结果列表进行动态排序(…)
。我实际上不知道如何构造earlierDate和laterDateOops。那么,让我给你一个答案:我是否可以建议使用Date#after
和Date#before
而不是compareTo
?这可能是个好主意,但问题是after()
和before()
是排他性的,即它们不包括确切的日期。您可以使用!date.before(…)
和!date.before(…)
分别表示“not before”和“not after”,但代码不一定比使用比较更清晰