【问题标题】:Java: Implementing "repeat until no change" collectionJava:实现“重复直到没有变化”集合
【发布时间】:2010-02-21 19:13:26
【问题描述】:

我正在尝试实现一种算法,该算法在集合(当前为列表)上重复应用操作。在每个步骤中,可以在集合中添加、删除和更改元素(使用 getter 和 setter)。重复该算法,直到在上一步中对集合没有任何更改。

元素的顺序不相关。但是,在下一个循环之前不应访问修改或创建的元素。

我的方法是有一个大的主循环,以及一个应用算法并将修改、创建和未更改的元素复制到第二个列表的内部循环。内循环完成后,原始列表被清空并被新列表替换。如果新旧列表包含相同的元素,则终止主循环。

最好的方法是什么?是否有开箱即用的集合支持此功能?第三方也还行。

任何帮助将不胜感激!

【问题讨论】:

    标签: java algorithm collections


    【解决方案1】:

    我只会使用在主循环开始时设置为 false 的布尔变量。当对内部循环中的列表进行更改时,可以将其设置为 true,如果未进行任何更改,则保持为 false。如果这是真的,则主循环可以继续循环,否则结束循环

    【讨论】:

    • +1 - 这是迄今为止最简单、最有效的解决方案。
    【解决方案2】:

    您的方法对我来说听起来很合理,但有很多收藏复制。我认为您可以将相同的集合提供给内部循环,以更新集合并指示是否进行了任何更改,例如while (collectionUpdated)。

    如果集合不是太大,或者您不希望对其进行很多更改,则递归效果很好。 例如

    runAlgo(Collection c) {
      // do work
    
      if (collectionUpdated)
        return runAlgo(c); // potential stackoverflow with huge collection or too many calls from lots of collection updates
      else
        return c;
    }
    

    【讨论】:

      【解决方案3】:

      既然您说顺序不相关,请使用Set interface 的实现,例如HashSet。您可以简单地使用 equals 方法比较集合是否相等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-14
        • 1970-01-01
        相关资源
        最近更新 更多