gpt4 book ai didi

java - EnumSet - 移动交叉点的有效方法

转载 作者:行者123 更新时间:2023-12-02 05:53:56 26 4
gpt4 key购买 nike

我有两个 EnumSet。

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

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)

最佳答案

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

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

fromSet.retainAll(MaterialTypes.IMMOVABLE_TYPES);

或者显式使用迭代器,以便您可以跳过对 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/retainAll/removeAll 将在内部使用迭代器。

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

关于java - EnumSet - 移动交叉点的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23283035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com