Dart:List.remove()不删除Object

时间:2015-12-18 06:45:59

标签: dart

如果您需要一个完整的示例,则代码位于CLI上(请参阅最后的while循环。)

我有一个循环,

Place place = places[0];
while (places.isNotEmpty) {
  // Get a list of places within distance (we can travel to)
  List reachables = place.getReachables();

  // Get the closest reachable place
  Place closest = place.getClosest(reachables);

  // Remove the current place (ultimately should terminate the loop)
  places.remove(place);

  // Iterate
  place = closest;
}

但它并没有在倒数第二行删除place。即,places列表的长度保持不变,使其成为无限循环。怎么了?

3 个答案:

答案 0 :(得分:2)

这可能是因为列表中的对象具有与您要删除的对象不同的hashCode。

尝试使用以下代码,通过比较对象属性来找到正确的对象,然后将其删除:

var item = list.firstWhere((x) => x.property1== myObj.property1 && x.property2== myObj.property2, orElse: () => null);

list.remove(item);

另一种选择是覆盖类中的==运算符和hashCode。

class Class1 {
  @override
  bool operator==(other) {
    if(other is! Class1) {
      return false;
    }
    return property1 == (other as Class1).property1;
  }

  int _hashCode;
  @override
  int get hashCode {
    if(_hashCode == null) {
      _hashCode = property1.hashCode
    }
    return _hashCode;
  }
}

答案 1 :(得分:1)

我遇到了同样的问题。不幸的是我还没有找到根本原因,但在同样的情况下我更换了

places.remove[place]

places.removeWhere(p => p.hachCode == place.hashCode)

作为一种解决方法。另一种方法也很有帮助:

// Get the place from your set:
final place = places.first;
// Replace the place in the set:
places.add(place);
// Remove the place from the set:
places.remove(place);

答案 2 :(得分:0)

由于某种原因,oldY=y很可能不在列表中。在不知道所使用的确切数据的情况下很难进行调试,问题无法通过链接DartPad中的三位样本重现。

尝试找出导致问题的元素。例如,你可以 尝试在删除之前添加place,或者在问题发生时检测状态的类似内容。