0

我有两个枚举集。

我想将某些值从一个转移到另一个,但在两个对象中保留那些被认为“不可移动”的值。示例代码...

Public enum  MaterialTypes {

    STONE,
    METAL,
    WOOD,
    STICKS,
    STRAW;

    // STONE & METAL are "immoveable"...
    public static EnumSet<MaterialTypes> IMMOVEABLE_TYPES = EnumSet.of(STONE, METAL);

}

EnumSet<MaterialTypes> fromTypes = EnumSet.of(CellType.STONE, CellType.WOOD, CellType.STICKS);
EnumSet<MaterialTypes> toTypes   = EnumSet.of(CellType.METAL, CellType.STRAW);

// How to preserve the IMMOVEABLE types, but transfer all the other types from one object to the other?
// E.g. Desired result...

// fromTypes = STONE                (i.e. STONE preserved, WOOD & STICKS removed)
// toTypes   = METAL, WOOD, STICKS   (i.e. METAL preserved, STRAW removed, WOOD & STICKS added)

我尝试了各种方法,但都涉及许多步骤和临时 EnumSet 的创建。我想知道是否有一种真正有效的方法以及(当然)它是什么。

这让我头疼!

谢谢。

更新:

我尝试的一种方法(我认为可能效率低下)来达到预期的结果......

EnumSet<MaterialTypes> tmpSet = fromTypes.clone();   // Create temporary copy of fromTypes

tmpSet.removeAll(MaterialTypes.IMMOVEABLE_TYPES);    // Leave only the MOVEABLE types in tmpSet

fromTypes.retainAll(MaterialTypes.IMMOVEABLE_TYPES); // Leave only the IMMOVEABLE type in fromTypes

toTypes.retainAll(MaterialTypes.IMMOVEABLE_TYPES);   // Leave only the IMMOVEABLE types in toTypes

toTypes.addAll(tmpSet);                         // Add the MOVEABLE types (originally in fromTypes)
4

1 回答 1

2

如果我理解正确,那么在不进行第二次收集的情况下进行操作的方法是这样的:

toSet.retainAll(MaterialTypes.IMMOVABLE_TYPES);
for(MaterialTypes mt : fromSet) {
    if(!MaterialTypes.IMMOVABLE_TYPES.contains(mt))
        toSet.add(mt);
}

fromSet.retainAll(MaterialTypes.IMMOVABLE_TYPES);

或者显式使用 Iterator 以便您可以跳过以下调用之一retainAll

toSet.retainAll(MaterialTypes.IMMOVABLE_TYPES);
for(Iterator<MaterialTypes> it = fromSet.iterator(); it.hasNext();) {
    MaterialTypes mt = it.next();
    if(!MaterialTypes.IMMOVABLE_TYPES.contains(mt)) {
        toSet.add(mt);
        it.remove();
    }
}

这样做只会让您在 Sets 和创建的 2 个对象之间进行两次迭代,而您在 OP 中执行此操作的方式更像是每个 5 个。addAll//将在内部使用一个迭代器retainAllremoveAll

但是你所做的似乎并没有非常低效,我个人不会担心。这些实际上是非常小的物体。如果此操作每秒完成 10,000 次,并且被证明是一个瓶颈,则更有可能需要重新设计该功能,以便它不使用集合。

于 2014-04-25T03:14:23.703 回答