【问题标题】:adding/copy objects to a new list in java将对象添加/复制到java中的新列表
【发布时间】:2020-06-13 12:03:07
【问题描述】:

如果列表中的对象通过条件,我想将它们复制到新列表中。

我有一个名为“inschrijvingen”的数组列表,在这个数组列表中有“Speler”的对象。

如果对象通过此方法时为真:

/**
     *
     * @param speler
     * @return
     */
    private boolean magDeelnemen(Speler speler) {
        Collections.sort(inschrijving);
        return speler.getHandicap() <= minNiveau && inschrijving.size() < maxSpelers;
    }

我想将它复制到一个名为“spelers”的新数组列表中 我已经为它写了这个方法:

/**
     * Als de deadline voor inschrijven is aangekomen kan de organisatie kijken wie mee mag spelen
     */
    public void isSpeler() {
        for (Speler speler : this.inschrijving) {
            if (magDeelnemen(speler)) {
                this.spelers.add(speler);
            }
        }
    }

我想在两个数组列表中都有对象,但是当我运行这段代码时,我得到:

Exception in thread "main" java.util.ConcurrentModificationException

【问题讨论】:

    标签: java


    【解决方案1】:

    magDeelnemen 中删除Collections.sort(inschrijving)。 如果您需要对列表inschrijving 进行排序,请在isSpeller 循环之前或之后对其进行排序。在您的情况下,您在迭代时修改列表,这就是为什么会引发异常并且您对每次迭代进行排序,这会浪费 cpu 周期。 此外,您可以使用流来创建相同的行为:

     this.inschrijving.stream().sorted().filter(this::magDeelnemen).collect(Collectors.toList());
    

    【讨论】:

    • 嗨,感谢您的输入,当我尝试 de isSpeler() 方法中的流时,我得到“无法解析列表中排序的方法。
    • 在排序前尝试在列表中调用stream()
    • 现在没有错误,谢谢,但现在 .collect 上显示“stream.collect 的结果被忽略”
    • 结果是你想要的列表,所以将它分配给一个变量
    【解决方案2】:

    您正在循环通过this.inschrijving 并在循环内调用方法magDeelnemen。但在该方法中,您正在对inschrijving 进行排序。

    你不能修改你正在循环的集合,我不明白为什么它必须用那种方法排序,所以最好的解决方案就是删除那个Collection.sort(inschrijving)

    【讨论】:

    • 不是删除而是从 magDeelnemen 替换为 isSpeler() 中的第一个字符串,
    • 谢谢!是的,我把 collection.sort 放在了错误的方法中,谢谢你看到它!
    猜你喜欢
    • 2021-10-24
    • 2021-03-22
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多