我可以将.removeif()中的.size()用作ArrayLists的条件吗?

时间:2019-10-31 03:16:13

标签: java arraylist

在我正在编写的程序中,如果双精度数小于某个特定值,我想将其从ArrayList中删除。但是,如果只剩下一个元素,即使它满足要删除的条件,我也不想删除它,因为我需要Arraylist不为空。

我在ArrayLists的javadoc中看到有一个removeIf(filter)方法,因此,我试写如下:

employeeLine.removeIf(customerTime -> (customerTime < nextCustomerArrival && employeeLine.size() > 1));

例如,如果使用nextCustomerArrival = 11.0employeeLine = [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新手。如果我说或尝试没有意义的事情,我发誓我不是要让你困惑或惹恼你,我只是在学习。

2 个答案:

答案 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);
    }