我想声明一个枚举Direction,它具有一个返回相反方向的方法(以下语法不正确,即,不能实例化枚举,但它说明了我的观点)。这在Java中可行吗? 这是代码: public enum Direction { NORTH(1), SOUTH(-1), EAST(-2), WEST(2); Direction(int code){ this.code=code; } protected int code; public int getCode() { return this.code; } static Direction getOppositeDirection(Direction d){ return new Direction(d.getCode() * -1); } }
我有一个经典的案例,尝试在循环中枚举项目时从集合中删除它: List<int> myIntCollection = new List<int>(); myIntCollection.Add(42); myIntCollection.Add(12); myIntCollection.Add(96); myIntCollection.Add(25); foreach (int i in myIntCollection) { if (i == 42) myIntCollection.Remove(96); // The error is here. if (i == 25) myIntCollection.Remove(42); // The error is here. } 在发生更改后的迭代开始时,InvalidOperationException会抛出an ,因为枚举器不喜欢基础集合的更改。 我需要在迭代时对集合进行更改。有许多模式可以用来避免这种情况,但是似乎没有一个好的解决方案: 不要在此循环内删除,而要保留一个单独的“删除列表”,在主循环后进行处理。 通常,这是一个很好的解决方案,但就我而言,我需要立即“等待”该项目,直到真正删除该项目的主循环改变了我的代码的逻辑流程。 无需删除该项目,只需在该项目上设置一个标志并将其标记为非活动即可。然后添加模式1的功能以清理列表。 这将满足我的所有需求,但是这意味着每次访问一个项目时,为了检查非活动标志,必须更改许多代码。按我的喜好,这太过分了。 以某种方式将模式2的思想纳入源自的类中List<T>。此超级列表将处理非活动标志,事实结束后的对象删除,也不会向枚举使用者显示标记为非活动的项目。基本上,它只是封装了模式2(以及随后的模式1)的所有思想。 是否存在这样的类?有人为此提供代码吗?或者,还有更好的方法? 有人告诉我,访问myIntCollection.ToArray()而不是myIntCollection可以解决问题,并允许我在循环内删除。 对我来说,这似乎是一种糟糕的设计模式,或者还好吗? 细节: 该列表将包含许多项目,我将仅删除其中一些。 …
我想枚举Swift中的数组,并删除某些项目。我想知道这样做是否安全,如果不能,我应该如何实现这一目标。 目前,我会这样做: for (index, aString: String) in enumerate(array) { //Some of the strings... array.removeAtIndex(index) }