Java流筛选指定的变量,将其删除,并删除行中的下3个变量

Java流筛选指定的变量,将其删除,并删除行中的下3个变量,java,java-stream,Java,Java Stream,是否可以在流中找到指定的变量并删除接下来的3个迭代对象 List<Double> hoursList = Arrays.asList(8.00,8.15,8.30, 8.45, 9.00,9.15, 9.30, 9.45,10.00, 10.15,10.30,10.45,11.00); Double visitTime = hoursList.get(4); int n = 3; List<Double> hours = hoursList.s

是否可以在流中找到指定的变量并删除接下来的3个迭代对象

List<Double> hoursList = Arrays.asList(8.00,8.15,8.30, 8.45, 9.00,9.15, 9.30, 9.45,10.00,
            10.15,10.30,10.45,11.00);

Double visitTime = hoursList.get(4);
int n = 3;

List<Double> hours = hoursList.stream().filter(x -> !x.equals(visitTime)).collect(Collectors.toList());

正如我在原始问题的评论中提到的,如果要从
列表中删除项目,请确保将其实例化为
新ArrayList(Arrays.asList())
新ArrayList(List.of())
,而不是
Arrays.asList()
Arrays.asList()
返回
数组
周围的固定大小包装,并直接由
数组
支持。否则,您将得到一个
不支持操作异常

话虽如此,我将使用
子列表
进行该工作,它要简单得多:

hoursList.subList(4, 4 + 3 + 1).clear();
如果您更喜欢接受参数以获得更大灵活性(并检查潜在索引超出范围)的方法:


您可以使用两个流的串联。使用
takeWhile
dropWhile
skip
,然后将两个流合并,将返回所需的结果:

    List<Double> hours = Stream.concat(
            hoursList.stream()
                    .takeWhile(e -> !e.equals(visitTime)),
            hoursList.stream()
                    .dropWhile(e -> !e.equals(visitTime))
                    .skip(3)
    ).collect(Collectors.toList());
List hours=Stream.concat(
hoursList.stream()
.takeWhile(e->!e.equals(visitTime)),
hoursList.stream()
.dropWhile(e->!e.equals(访问时间))
.跳过(3)
).collect(Collectors.toList());

如果元素是时间,则将其作为时间处理,而不是双倍数字。java.time的
LocaTime
类,即现代java日期和时间API,正是您所需要的

    List<LocalTime> hoursList = Stream.iterate(LocalTime.of(8, 0), t -> t.plusMinutes(15))
            .limit(13)
            .collect(Collectors.toList());
    System.out.println(hoursList);
    
    LocalTime startTime = LocalTime.of(8, 45);
    LocalTime endTime = startTime.plusHours(1);
    List<LocalTime> hours = new ArrayList<>(hoursList);
    hours.removeIf(t -> ! t.isBefore(startTime) && t.isBefore(endTime));

    System.out.println(hours);
我同意Harshal Parekh的观点,即与流操作相比,使用
removeIf()
更可读、更简单。这两种选择都是可能的。要使
removeIf()
正常工作,我们需要确保有一个可修改的列表。复制到新的
ArrayList
可确保这一点


链接:解释如何使用java.time。

如果要从
列表中删除项目
,请确保将其实例化为
新ArrayList(Arrays.asList())
,而不是
Arrays.asList()
Arrays.asList()
返回数组周围的固定大小包装,并由数组直接支持。否则,您将得到一个
不支持操作异常
。是否要删除所有9点钟?这是我的主要问题,为什么我无法按循环中的索引编辑我的列表by.add和.remove。非常感谢,我花了半天时间来解决这个问题List hoursList=newarraylist(Arrays.asList(8.00,8.15,8.30,8.45,9.00,9.15,9.30,9.45,10.00,10.15,10.30,10.45,11.00));'但现在我了解了一些关于溪流的知识,它看起来比环路更好。感谢@obeare您多次使用
double
值?当然不要。使用
LocalTime
对象。是的,我使用的是双值。我刚开始制作自己的网络应用程序,所有提示都很有用。将尝试使用LocalTime对象@Ole V.V。为什么不简单地
hoursList.stream().takeWhile(e->!e.equals(visitTime)).skip(N+1).collect(Collectors.toList())
?@Naman它将在9.00停止并删除前4个索引。摘要“小时”是空的。只要不正确地使用
double
数字乘以0.15,将无助于删除9.45和10.00(9.45+0.15等于9.6-近似值;不要期望双重数学是精确的)。solution@miljon对我来说非常有用。这就是我要找的。我希望它能帮助其他人解决他们的问题problems@OleV.V.oh上帝你是对的,我在想时间,忘了它们是数字,因为
index
已经是问题输入的一部分,你可以直接在方法签名中使用它。我只是猜测真正的输入是小时,他想阻塞一个时间段。如果这个假设成立,那么OP更好地依赖于时间,这也是我们在评论中讨论的。我同意,OP可以选择一个更符合其主要目标的选项。但另一个选项只有在所有时隙大小相等时才有效。
List<Double> hoursRemoved = removeHours(hoursList, 9.0, 3);   
System.out.println(hoursRemoved);
[8.0, 8.15, 8.3, 8.45, 10.0, 10.15, 10.3, 10.45, 11.0]
    List<Double> hours = Stream.concat(
            hoursList.stream()
                    .takeWhile(e -> !e.equals(visitTime)),
            hoursList.stream()
                    .dropWhile(e -> !e.equals(visitTime))
                    .skip(3)
    ).collect(Collectors.toList());
    List<LocalTime> hoursList = Stream.iterate(LocalTime.of(8, 0), t -> t.plusMinutes(15))
            .limit(13)
            .collect(Collectors.toList());
    System.out.println(hoursList);
    
    LocalTime startTime = LocalTime.of(8, 45);
    LocalTime endTime = startTime.plusHours(1);
    List<LocalTime> hours = new ArrayList<>(hoursList);
    hours.removeIf(t -> ! t.isBefore(startTime) && t.isBefore(endTime));

    System.out.println(hours);
[08:00, 08:15, 08:30, 08:45, 09:00, 09:15, 09:30, 09:45, 10:00, 10:15, 10:30, 10:45, 11:00]
[08:00, 08:15, 08:30, 09:45, 10:00, 10:15, 10:30, 10:45, 11:00]