Java 枚举集-移动交叉点的有效方法

Java 枚举集-移动交叉点的有效方法,java,enumset,Java,Enumset,我有两套 我想将某些值从一个对象转移到另一个对象,但在两个对象中保留那些被视为“不可移动”的值。示例代码 Public enum MaterialTypes { STONE, METAL, WOOD, STICKS, STRAW; // STONE & METAL are "immoveable"... public static EnumSet<MaterialTypes> IMMOVEABLE_TYPES =

我有两套

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

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-fromTypes=EnumSet.of(CellType.STONE、CellType.WOOD、CellType.STICKS);
EnumSet-toTypes=EnumSet.of(CellType.METAL,CellType.STRAW);
//如何保留不可移动的类型,但将所有其他类型从一个对象转移到另一个对象?
//例如,期望的结果。。。
//fromTypes=石头(即保存的石头、移除的木头和木棍)
//toTypes=金属、木材、木棍(即金属保护、稻草移除、木材和木棍添加)
我尝试过各种方法,但都涉及许多步骤和临时枚举集的创建。我想知道是否有一种真正有效的方法,以及(当然)它是什么

这让我头疼

谢谢

更新:

我尝试的一种方法(我认为可能是无效的)达到了预期的效果

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)
EnumSet tmpSet=fromTypes.clone();//创建fromTypes的临时副本
tmpSet.removeAll(材料类型.固定类型);//在tmpSet中只保留可移动类型
fromTypes.Retainal(材质类型.固定类型);//在fromTypes中只保留不可移动的类型
toTypes.Retainal(材料类型.固定类型);//在toTypes中只保留不可移动的类型
toTypes.addAll(tmpSet);//添加可移动类型(最初在fromTypes中)

如果我理解正确,不进行第二次收集的方法如下:

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

fromSet.retainAll(MaterialTypes.IMMOVABLE_TYPES);
或者显式使用迭代器,以便跳过对
retainal
的调用之一:

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();
    }
}
toSet.retainal(材料类型、固定类型);
for(Iterator it=fromSet.Iterator();it.hasNext();){
MaterialTypes mt=it.next();
如果(!MaterialTypes.Fimoved_TYPES.contains(mt)){
toSet.add(mt);
it.remove();
}
}
这样做只会在集合和创建的2个对象之间进行两次迭代,而在OP中这样做的方式使用了5次迭代
addAll
/
retainal
/
removeAll
将在内部使用迭代器


但你所做的似乎并不是非常低效,我个人也不会为此担心。这些实际上是相当小的物体。如果此操作每秒执行10000次,并且被证明是一个瓶颈,则更有可能需要重新设计该功能,使其不使用集合。

现在您的示例说
toTypes=METAL,WOOD,STRAW(即金属保护、移除STRAW、添加WOOD&STICKS)
,这没有意义。你能纠正一下吗?你能不能也澄清一下你到底想做什么?如果可能的话,向我们展示你编写的代码,它可以做到这一点,但是你认为它效率不高。啊,更正了,谢谢。(告诉过你这让我头疼!)我会添加我在片刻内尝试过的代码(当我把我弄得一团糟的时候!-)谢谢Radiodef-我添加了一些代码,似乎达到了预期的效果,但对我来说似乎难以置信地夸张了,特别是因为我执行这个方法的频率非常高。非常好,感谢您提供这些选项Radiodef。