【问题标题】:How to reverse enum?如何反转枚举?
【发布时间】:2015-02-27 10:08:25
【问题描述】:

我在下面有一个枚举类

public class PTalkCommand {
public enum Code {
        CLR((byte) 0),
        ACK((byte) 170),
        SER((byte) 0),
        NAK((byte) 0),
        TIMEOUT((byte) 255),
        DIP((byte) 173),
        REQUEST_CHECKSUM((byte) 162),
        REQUEST_STATUS((byte) 181),
        REQUEST_FLASH((byte) 166),
        REQUEST_CONFIG_READ((byte) 249),
        REQUEST_STATUS_SCREEN((byte) 208),
        REQUEST_MULTIPULSE_CONFIG((byte) 0),
        REQUEST_SERIAL_NUMBER((byte) 62),
        REQUEST_BILL_NAMES((byte) 64),
        DO_FLASH((byte) 161),
        DO_MOTOR((byte) 81),
        DO_SEND_EE_PROM_DATA((byte) 50),
        DO_ENTER_FILE_NAME((byte) 61),
        DO_ENTER_SERIAL_NUMBER((byte) 63),
        DO_CONFIGURE((byte) 248),
        DO_MULTIPULSE_CONFIG((byte) 210),
        DATA_COLLECTION_RAW_SENSORS((byte) 84),
        DATA_COLLECTION_MODE((byte) 0),
        DATA_COLLECTION_CAL_POINTS((byte) 0),
        DATA_COLLECTION_WITH_DEBUG((byte) 68),
        DATA_COLLECTION_EXIT((byte) 119),
        CALIBRATE_OAS((byte) 150),
        CALIBRATE_NOTE_PRESENT_PUNCH((byte) 0),
        CALIBRATE_CB_REMOVED((byte) 0),
        CALIBRATE_IR_BLUE_TRANSMISSIVE((byte) 0),
        CALIBRATE_IR_REFLECTIVE((byte) 0),
        CALIBRATE_BLUE_REFLECTIVE((byte) 0),
        CALIBRATE_MONITOR_VOLTAGES((byte) 0),
        STACKER_OR_STACKERLESS((byte) 158),
        CALIBRATE_CURVE_LEVER((byte) 0),
        REQUEST_BEZEL_REV_LEV((byte) 73),
        DO_BEZEL_UPDATE((byte) 82);

        private final byte valueCode;

        private Code(byte value) {
            this.valueCode = value;
        }

        public byte getValue() {
            return valueCode;
        }
    }
}

并希望它以相反的顺序排列。在.Net中代码是这样的

public void Prepend (PTalkCommand.Code[] commands) {
            IEnumerable<PTalkCommand.Code> enumerable = commands.Reverse<PTalkCommand.Code> ();
            foreach (PTalkCommand.Code current in enumerable) {
                base.Insert (0, (byte)current);
            }
        }

在 Java 中我也在尝试这样做。

Enumeration<PTalkCommand.Code> enumerable = commands. ???????

但是,我做不到。请告诉我如何在 Java 中做同样的事情?

【问题讨论】:

    标签: java android enums


    【解决方案1】:

    有一个内置的.values() 方法可以返回一个包含所有枚举常量的数组。您可以向后迭代它。

    Code[] values = Code.values();
    for (int i = values.length - 1; i >= 0; i--) {
        Code next = values[i];
        //do your thing
    }
    

    【讨论】:

      【解决方案2】:

      您可以将此内部类添加到您的enum

          public static class Backwards implements Iterable<Code> {
      
              @Override
              public Iterator<Code> iterator() {
                  return new Iterator<Code>() {
                      private Code[] codes = Code.values();
                      private int i = codes.length - 1;
      
                      @Override
                      public boolean hasNext() {
                          return i >= 0;
                      }
      
                      @Override
                      public Code next() {
                          if (i < 0) {
                              throw new NoSuchElementException();
                          }
                          return codes[i--];
                      }
      
                  };
              }
      
          }
      

      【讨论】:

      • 我想知道为什么 oracle 没有做任何改进 Enum 功能... :-\
      • @marcolopes - 因为恕我直言,Java 中的 enum 已经非常灵活了。
      • 我想念一些方法,例如 names() - 字符串名称数组,以及扩展它们的可能性(这将是一大优势!)
      猜你喜欢
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 2020-01-17
      • 2021-05-07
      • 2016-07-13
      • 1970-01-01
      • 2010-09-11
      相关资源
      最近更新 更多