【问题标题】:How to compare values within two List<List<CustomClass>> in Dart?如何比较 Dart 中两个 List<List<CustomClass>> 中的值?
【发布时间】:2021-02-13 01:08:46
【问题描述】:

我有一个 2048 类型的游戏,其中游戏板网格由 4 个其他列表(每个列表包含 4 个 Tiles)组成。

每次移动时,newGameboardGrid 都会保存在另一个列表中(这样当玩家想要撤消移动时可以调用 removeLast)。

当玩家滑动时,我需要将 newGameboardGrid 网格与前一个网格进行比较,以查看是否发生了任何实际移动或图块值是否仍然相同(如果玩家向没有移动的方向滑动就会发生这种情况是可能的)。

我试过这段代码:

if (newGameboardGrid == listOfGameboardGrids.last) {
// do something
}

它几乎可以工作,因为它 比较新动作的 > 与上一动作的 >,但问题是它永远不会导致两个 > 相等,即使所有 tile 值都相同。我相信这是因为它在比较哈希码和/或其他东西。

Tile 类中有很多东西,但我想比较的是名为“value”的 int。是否可以只比较这两个 > 的“值”变量?

提前感谢您的帮助! (如果我的任何条款不准确,请致歉。)

【问题讨论】:

  • 您是否至少对Tile 类进行了某种比较?

标签: dart


【解决方案1】:

Dart 列表实现不会覆盖 Objectoperator==,因此它们永远只等于它们自己。不检查元素。

如果您想比较元素(这里是列表元素的元素),您可以使用来自package:collectionEquality 类:

const boardEquality = ListEquality(ListEquality(DefaultEquality()));

这将创建一个ListEquality 对象,该对象通过检查它们是否包含相同数量的列表来比较两个元素列表列表,这些列表再次包含相同数量的相等元素。 (我假设Tile 实现了operator==)。

您可以将其用作:if (boardEquality.equals(newGameboardGrid, listOfGameboardGrids.last)) { ... }

【讨论】:

    【解决方案2】:

    您可以对您的特定列表类型执行扩展方法并创建一个isEqual 方法来比较每个Tile

    extension TileListComp on List<List<Tile>> {
      bool isEqual(List<List<Tile>> other) {
        if(this.length != other.length || this[0]?.length != other[0]?.length) {
          return false;
        }
        for(int x = 0; x < this.length; x++) {
          for(int y = 0; y < this[0].length; y++) {
            if(this[x][y] != other[x][y]) {
              return false;
            }
          }
        }
        return true;
      }
    }
    

    如果您没有为您的Tile 类实施任何类型的比较,则需要这样做。如有需要,我可以提供建议。

    【讨论】:

    • 感谢您的回复!我刚刚看了一些关于扩展方法的教程,我理解了一般概念,但我不确定如何实现。不,我没有为 Tile 类实现任何类型的比较。也许我可以创建一个 for 循环,通过并从 newGameboardGrid >> 中的每个图块中获取值并将其存储在 16 个数字的列表中,然后对上一步执行相同操作,然后进行比较这两个列表?
    • @Derence 我已经在我的答案中提供了一种嵌套列表相等的方法。您只需要在 Tile 类中实现平等。
    • @Derence 除了在 Tile 类中存储 x 和 y 坐标之外,还有一个二维数组有什么意义?
    猜你喜欢
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 2012-03-25
    • 2023-03-07
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多