【问题标题】:Java enums and arraysJava 枚举和数组
【发布时间】:2011-12-12 01:43:17
【问题描述】:

我有一些 C++ 代码要移植到 Java。

我的代码看起来像这样@

enum direction {UP, DOWN, LEFT, RIGHT, NEUTRAL};
int LINK[5];
.....
//fill LINK array
.....
if (desired_direction == LEFT  ) || (LINK[LEFT]  > 0) return true;
if (desired_direction == RIGHT ) || (LINK[RIGHT] > 0) return true;
if (desired_direction == UP    ) || (LINK[UP]    > 0) return true;
if (desired_direction == DOWN  ) || (LINK[DOWN]  > 0) return true;

所以我有一个用整数填充的数组,我使用枚举作为数组的索引。

Java 的处理方式是什么?

谢谢

【问题讨论】:

  • 即使对于 C++,您的 if 语句中也缺少 () 字符。
  • 是的。为了清楚起见,我在发布问题之前编辑了代码并忘记重新添加括号。

标签: java c++ arrays enums


【解决方案1】:

基本上没有什么不同。

事实上,这里唯一缺少的是每个 if 语句的两个条件的括号。

此外,您对枚举值的调用将是 direction.whatever.ordinal() 而不仅仅是 whatever

【讨论】:

  • 这是不对的,不能使用枚举作为 int 数组的索引
  • 你需要调用 Direction.Left.ordinal()
  • @NimChimpsky 谢谢。我忘记了枚举不是自然的序数。
  • 澄清一下,我没有测试过,但似乎代码是一样的,除了“if (desired_direction == LEFT) || (LINK[LEFT] > 0) return true;”变为“如果 (desired_direction == direction.LEFT) || (LINK[direction.LEFT.ordinal()] > 0) return true;”等(是的,if语句周围缺少parethensis
【解决方案2】:

您可以使用 EnumSet 代替整数数组。 Java 中的枚举确实有一个与每个实例关联的整数(从 ordinal() 方法获得,您可以使用它来保持上述代码不变),并且 EnumSet 是使用 long as 位域实现的(嗯,这就是 RegularEnumSet,并且有超过 64 个成员的枚举的替代实现 - 选择被封装)。

比如:

EnumSet<Direction> links = EnumSet.noneOf(Direction.class);
// populate links (links.add(Direction.UP) etc)
if (desired_direction == LEFT || links.contains(Direction.LEFT)) return true;
// etc...

【讨论】:

    【解决方案3】:

    你可以遍历一个方向[]:

    direction[] enumVals = direction.values();
    for(direction dir: enumVals) {
        if ((dir == direction.LEFT  ) || (LINK[dir.ordinal()]  > 0))
            return true;
    }
    

    enumName.values() 返回一个 enumName[],其中包含枚举的所有元素。

    请注意,您不能将枚举元素直接用作数字。您需要调用(例如)direction.LEFT.ordinal() 以获取枚举中元素的从 0 开始的序号。

    【讨论】:

    • 如果您希望它与原始代码相同,请将“direction.LEFT”替换为desired_direction。
    【解决方案4】:

    你的枚举可能是这样的:

    public enum Direction {
        UP(0), DOWN(1), LEFT(2), RIGHT(3), NEUTRAL(4);
        private Integer index;
    
        Direction(Integer index){
            this.index = index;
        };
    
        public Integer getIndex(){
            return this.index;
        }
    }
    

    然后是你的 if 语句:

    Direction desired_direction = Direction.LEFT;
    int[] LINK = {2,0,0,0,0};
    if (desired_direction == Direction.LEFT  || LINK[Direction.LEFT.getIndex()]  > 0){
     return true;
    }
    

    或者您可以引用ordinal() 方法而不是显式创建索引整数。像这样LINK[Direction.LEFT.ordinal()] &gt; 0

    但是也许使用哈希图可能是合适的(尽管逻辑与您的问题不太一样:

    Map<Direction, Integer> myLink = new HashMap<Direction, Integer>(5);
            myLink.put(Direction.LEFT, 2);
            myLink.put(Direction.RIGHT, 0);
            myLink.put(Direction.UP, 0);
            myLink.put(Direction.DOWN, 0);
    
            if(myLink.get(desired_direction) > 0) 
            {
                return true;
            }
    

    但我最喜欢的是将所有逻辑放在枚举本身上,然后将 int 数组作为参数传递:

    public Boolean getAnalysis(int[] link){
      return link[this.getIndex()]  > 0 ? Boolean.TRUE:Boolean.FALSE; 
    }
    

    我也喜欢显式设置索引属性而不是依赖序数,以防万一将来有人更改枚举 你的电话会这样

    Direction desired_direction = Direction.LEFT;
    return desired_direction.getAnalysis(LINK);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      相关资源
      最近更新 更多