Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java根据时间范围确定有效数据_Java_List_Date_Range - Fatal编程技术网

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您能提供任何代码片段或伪代码吗?:)