【问题标题】:How to sort Enum and add to an array如何对枚举进行排序并添加到数组中
【发布时间】:2017-05-01 22:54:08
【问题描述】:

我有一个枚举

    Customer("Customer"),
    BankName("Bank Name"),
    AccountNumber("Account Number"),
    Amount("Available Amount");

我有一个整数数组,其中包含正确的顺序

private static int[] realOrder;

我有一个按正确顺序对枚举进行排序的方法

public static void configureColumns(Column... newOrder)
    {
        realOrder = new int[values().length];
        for (Column column : values())
        {
            realOrder[column.ordinal()] = -1;
            boolean isFound = false;

            for (int i = 0; i < newOrder.length; i++)
            {
                if (column == newOrder[i])
                {
                    if (isFound)
                    {
                        throw new IllegalArgumentException("Column '" + column.columnName + "' is already configured.");
                    }
                    realOrder[column.ordinal()] = i;
                    isFound = true;
                }
            }
        }
    }

当我这样调用那个方法时

Column.configureColumns(Column.Amount, Column.AccountNumber, Column.BankName);

我想打印出来

 * Available Amount
 * Account Number
 * Bank Name

我有一个方法,根据 realOrder 索引返回一个链表

public static List<Column> getVisibleColumns()
    {
        List<Column> result = new LinkedList<>();

        int index;

        for(int i = 0; i < realOrder.length; i++)
        {
            if(realOrder[i]!=-1)
            {
                index = realOrder[i];
                result.add(index, Column.values()[index]);
           }
        }
        return result;
    }

但我得到java.lang.IndexOutOfBoundsException: Index: 2, Size: 0 因为我应该从 0 开始填充数组。如果我从最小到最大对 realOrder 数组进行排序,它可以工作,但不是它预期的方式。我该如何解决?

【问题讨论】:

  • 你正在做一些非常奇怪和不必要的事情。您正在为一种方法下达自己的命令,为什么要排序等等?我建议完全改变设计,甚至给枚举本身添加另一个参数会更好,比如Customer("Customer", 2)

标签: java arrays sorting enums


【解决方案1】:

您似乎希望getVisibleColumns() 返回与configureColumns() 完全相同的值,那么为什么不记住这一点呢?

public enum Column {
    Customer("Customer"),
    BankName("Bank Name"),
    AccountNumber("Account Number"),
    Amount("Available Amount");

    private static Column[] realOrder;
    private final String columnName;

    private Column(String columnName) {
        this.columnName = columnName;
    }

    public String getColumnName() {
        return this.columnName;
    }

    public static void configureColumns(Column... newOrder) {
        realOrder = newOrder.clone();
    }

    public static List<Column> getVisibleColumns() {
        return Collections.unmodifiableList(Arrays.asList(realOrder));
    }
}

如果您还需要知道特定Column 的订单索引,请不要创建单独的数组来存储它。只需在枚举中添加一个额外的字段:

private int orderIndex = -1;

然后在配置的时候更新值:

public static void configureColumns(Column... newOrder) {
    realOrder = newOrder.clone();
    for (Column column : values())
        column.orderIndex = -1;
    for (int i = 0; i < newOrder.length; i++)
        newOrder[i].orderIndex = i;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    相关资源
    最近更新 更多