gpt4 book ai didi

java 枚举新列表创建没有按预期工作

转载 作者:行者123 更新时间:2023-11-30 08:03:18 25 4
gpt4 key购买 nike

好吧,这让我很困惑,也许我错过了什么。

我有一个枚举类型列表,我正在尝试删除重复项。在下面的代码中,我无法创建新列表,因为列表在迭代期间被清空。

任何人都可以发现问题。

List<UserRole> newList = new ArrayList<UserRole>();

for (UserRole userRole: originalList)
{
boolean found = false;

logger.trace("size of new list: check1 = "+newList.size()); <-- size resets to 0

for (UserRole newRole: newList)
{
logger.trace("check "+userRole.name()+ " with "+newRole.name());
if (StringUtils.equals(newRole.name(),userRole.name()))
{
found = true;
break;
}
}

if (!found)
{
newList.add(userRole);
logger.trace("size of new list check2= "+newList.size());
}
}
return newList;

UserRole 枚举类看起来像

public enum UserRole {

SYSADMIN,
ADMIN,
STUDENT,
TEACHER,
PRINCIPAL;

public String value() {
return name();
}

public static UserRole fromValue(String v) {
return valueOf(v);
}

}

跟踪日志

20:20:22.291 TRACE  44 removeDuplicates - size of new list check1 = 0
20:20:22.291 TRACE 57 removeDuplicates - checking duplicate passed for role = SYSADMIN
20:20:22.291 TRACE 59 removeDuplicates - size of new list check2 = 1
20:20:22.295 TRACE 44 removeDuplicates - size of new list check1 = 0
20:20:22.295 TRACE 57 removeDuplicates - checking duplicate passed for role = SYSADMIN
20:20:22.295 TRACE 59 removeDuplicates - size of new list check2 = 1
20:20:22.296 TRACE 44 removeDuplicates - size of new list check1 = 0
20:20:22.296 TRACE 57 removeDuplicates - checking duplicate passed for role = SYSADMIN
20:20:22.296 TRACE 59 removeDuplicates - size of new list check2 = 1
20:20:22.298 TRACE 44 removeDuplicates - size of new list check1 = 0
20:20:22.298 TRACE 57 removeDuplicates - checking duplicate passed for role = SYSADMIN
20:20:22.298 TRACE 59 removeDuplicates - size of new list check2 = 1

最佳答案

显示代码不会在每次迭代时重置新列表。

但是,您不应该使用枚举值的 List。使用 EnumSet相反。

作为一个Set,它会自动防止重复。

不同于 ListLinkedHashSet,其中顺序是插入顺序,以及 HashSet,其中顺序是任意的,EnumSet 的顺序与定义枚举值的顺序相同。

另外,EnumSet 是紧凑的并且有非常好的处理枚举的辅助方法:

  • EnumSet.copyOf(originalList) 轻松完成您正在尝试的事情
  • EnumSet.allOf(UserRole.class)
  • EnumSet.noneOf(UserRole.class)
  • EnumSet.of(UserRole.STUDENT, UserRole.TEACHER)
  • EnumSet.complementOf(EnumSet.of(UserRole.SYSADMIN)) 所有枚举,SYSADMIN 除外

关于java 枚举新列表创建没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36380252/

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