在我正在编写的程序中,如果双精度数小于某个特定值,我想将其从ArrayList中删除。但是,如果只剩下一个元素,即使它满足要删除的条件,我也不想删除它,因为我需要Arraylist不为空。
我在ArrayLists的javadoc中看到有一个removeIf(filter)
方法,因此,我试写如下:
employeeLine.removeIf(customerTime -> (customerTime < nextCustomerArrival && employeeLine.size() > 1));
例如,如果使用nextCustomerArrival = 11.0
和employeeLine = [2.0, 5.0, 8.5]
,那么在使用我写的内容之后,我希望看到employeeLine = [8.5]
。但是,此行是我正在编写的一个更大的类的一部分,并且我不确定如何轻松地检查这是否行得通。任何帮助都会很棒。
Edit1:修复了moilejter指出的错别字;谢谢队友。
Edit2:我尝试将其编译并得到以下错误:
MultiLaneSimulation.java:66: error: local variables referenced from a lambda expression must be final or effectively final
lines.get(j).removeIf(customer -> (customer < sequentialArrivalTime && lines.get(j).size() > 1));
^
1 error
所以,没有骰子。另外,我尝试在测试代码的main方法中对此进行测试,它将删除所有元素,而不是一个元素。然后,我尝试了一个for-each循环,但这导致我得到Exception in thread "main" java.util.ConcurrentModificationException
,因此再也没有骰子了。
在这一点上,我将尝试编写一种可以满足我需要的帮助方法。如果我设法弄清楚了,我会把它发布给其他人/如果您感到好奇的话。
Edit3:对于上下文,我本质上是将这些ArrayLists用作已排序的队列(first =最小-> last =最大),因此,如果发生这种情况,我只会对保留last元素感兴趣。 / p>
P.S。 Pre-Emptive道歉:我是SO的初学者,并且会自称为Java新手。如果我说或尝试没有意义的事情,我发誓我不是要让你困惑或惹恼你,我只是在学习。
答案 0 :(得分:1)
这将是您条件的伪代码,
1)将列表中的lastElement保存到一个临时变量中。
2)删除所有元素 3)如果删除了所有元素,则需要添加在步骤1中保存的临时值。public static void removeLessThan(Double minimumAllowedValue, ArrayList<Double> list) {
Double lastElement = list.get(list.size() - 1); //Assuming List is not empty and contains atleast 1 element.
list.removeIf(element -> element < minimumAllowedValue);
if(list.isEmpty()) {
list.add(lastElement);
}
}
答案 1 :(得分:0)
如所承诺的,我能够编写一个帮助程序来完成我想要的。我敢肯定,存在一个更好/更可靠/更强大/等等。解决方案,但是,嘿,现在已经是午夜了,所以我将尽我所能。以下是我的创作:
/**
* Removes doubles from an ArrayList that are strictly less than the given parameter
* NOTE: leaves the last element if this would reduce the ArrayList.size() to 0
*
* @param minimumAllowedValue Of type Double; remaining values in the ArrayList will be greater than or equal to it
* @param list Of type ArrayList<Double>; the ArrayList we are changing
*/
public static void removeLessThan(Double minimumAllowedValue, ArrayList<Double> list) {
ArrayList<Double> toRemove = new ArrayList<Double>();
for (Double element : list) {
if (element < minimumAllowedValue) {
toRemove.add(element);
}
}
if (toRemove.size() == list.size()) {
toRemove.remove(list.size() - 1);
}
list.removeAll(toRemove);
}