首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Dart中比较两个List<List<CustomClass>>中的值?

如何在Dart中比较两个List<List<CustomClass>>中的值?
EN

Stack Overflow用户
提问于 2021-02-13 01:08:46
回答 2查看 216关注 0票数 0

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

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

当玩家滑动时,我需要将newGameboardGrid网格和前一个网格进行比较,看看是否发生了任何实际的移动,或者瓷砖的值是否仍然相同(就像玩家在没有可能移动的方向上滑动一样)。

我试过这个代码:

代码语言:javascript
运行
复制
if (newGameboardGrid == listOfGameboardGrids.last) {
// do something
}

这几乎是因为它将新移动的>与上一步的>进行了比较,但问题是,即使所有的平铺值都相同,也永远不会导致两个>相等。我相信这是因为它在比较哈希码和/或其他东西。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-13 17:12:28

Dart列表实现不覆盖operator== of Object,因此它们只能与自己相等。没有检查这些元素。

如果要比较元素(这里是列表元素的元素),可以使用来自package:collectionpackage:collection

代码语言:javascript
运行
复制
const boardEquality = ListEquality(ListEquality(DefaultEquality()));

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

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

票数 0
EN

Stack Overflow用户

发布于 2021-02-13 01:35:11

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

代码语言:javascript
运行
复制
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类实现了任何类型的比较,则需要这样做。必要的话我可以告诉你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66181011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档