Java根据时间范围确定有效数据
在给定日期确定有效属性值的最佳方法是什么 该表如下所示:Java根据时间范围确定有效数据,java,list,date,range,Java,List,Date,Range,在给定日期确定有效属性值的最佳方法是什么 该表如下所示: Map<String, SortedMap<LocalDate, Attribute>> attribs = ....; LocalDate targetDate = LocalDate.now(); //get the map for "attr1" or an empty map if there isn't one Iterator<Attribute> itr = at
Map<String, SortedMap<LocalDate, Attribute>> attribs = ....;
LocalDate targetDate = LocalDate.now();
//get the map for "attr1" or an empty map if there isn't one
Iterator<Attribute> itr = attribs.getOrDefault("attr1", Collections.emptySortedMap())
.tailMap( targetDate )
.values()
.iterator();
//since we have descending order we're first checking the entries that have become valid last
//so just continue until you hit one that hasn't become invalid already or you run out of entries
while(itr.hasNext()) {
Attribute attr = itr.next();
if(!attr.validTo.isBefore(targetDate )) {
return attr.value;
}
}
//no value found, could also return an empty Optional
return null;
属性名
价值
有效期自
属性1
41
01.01.2020
属性1
41,123
02.02.2021
属性1
41,456
02.02.2023
由于您只提供了数据而没有提供代码,因此我们假设您有一个
属性元素列表,这些元素如下所示(简化):
理想情况下,您可以为每个属性名称维护一个树映射,该树映射按有效性从
排序,例如映射
然后获取属性名称的排序映射,根据所讨论的日期获取尾部或头部映射,并进行迭代。假设您已通过从validFrom
降序对地图进行排序,它可能如下所示:
Map<String, SortedMap<LocalDate, Attribute>> attribs = ....;
LocalDate targetDate = LocalDate.now();
//get the map for "attr1" or an empty map if there isn't one
Iterator<Attribute> itr = attribs.getOrDefault("attr1", Collections.emptySortedMap())
.tailMap( targetDate )
.values()
.iterator();
//since we have descending order we're first checking the entries that have become valid last
//so just continue until you hit one that hasn't become invalid already or you run out of entries
while(itr.hasNext()) {
Attribute attr = itr.next();
if(!attr.validTo.isBefore(targetDate )) {
return attr.value;
}
}
//no value found, could also return an empty Optional
return null;
Map attribs=。。。。;
LocalDate targetDate=LocalDate.now();
//获取“attr1”的映射或空映射(如果没有)
迭代器itr=attribs.getOrDefault(“attr1”,Collections.emptySortedMap())
.tailMap(targetDate)
.values()
.iterator();
//因为我们有降序,所以我们首先检查最后生效的条目
//所以,只要继续,直到你点击了一个还没有变成无效的,或者你用完了条目
while(itr.hasNext()){
属性attr=itr.next();
如果(!attr.validTo.isBefore(targetDate)){
返回属性值;
}
}
//未找到值,也可能返回空的可选值
返回null;
如果您没有这样的映射,也可以使用流来完成,但重复查找的效率会更低:
List<Attribute> attribs = ...;
LocalDate targetDate = LocalDate.now();
OptionalDouble value =
attribs.stream()
.filter(a -> a.name.equals("attrib1")) //remove all other attribs
.filter(a -> !a.validFrom.isAfter(targetDate)) //remove all that not yet valid
.filter(a -> !a.validTo.isBefore(targetDate)) //remove all that aren't valid anymore
.sorted(Comparator.comparing(a -> a.validFrom).reverseOrder()) //sort by validFrom in descending order to get the latest
.mapToDouble(a -> a.value) //extract the value
.findFirst(); //pick the first value if one exists
List attribs=。。。;
LocalDate targetDate=LocalDate.now();
OptionalDouble值=
attribs.stream()
.filter(a->a.name.equals(“attrib1”)//删除所有其他attrib
.filter(a->!a.validFrom.isAfter(targetDate))//删除所有尚未生效的
.filter(a->!a.validTo.isBefore(targetDate))//删除所有不再有效的
.sorted(Comparator.comparing(a->a.validFrom).reverseOrder())//按validFrom降序排序以获取最新的
.mapToDouble(a->a.value)//提取值
.findFirst()//选择第一个值(如果存在)
使用“表”表明这实际上是一个SQL问题而不是Java问题,不是吗?一般来说,您希望删除那些在第X天之后开始或在第X天之前结束的(在第二种情况下),按“valid from”降序排序,然后选择第一个。它应该是Java:)为了清晰和可视化,我附上了表TreeMap
可能会完成这项工作。但您的第二个示例不清楚,因为在某些天,您有多个有效值。在第二个示例中,如果日期为03.02.2021,则有效值为41,123@assylias您能提供任何代码片段或伪代码吗?:)