按递减值的顺序迭代枚举的所有值。

时间:2017-03-12 18:35:48

标签: java enums

我有印度货币的枚举。

public enum HardCurrency {
    ONE(1), FIVE(5), TEN(10), TWENTY(20), FIFTY(50), HUNDRED(100), FIVE_HUNDRED(
            500), TWO_THOUSAND(2000);

    final static Logger logger = LoggerFactory.getLogger(HardCurrency.class);

    private final BigDecimal value;

    HardCurrency(int value) {
        this.value = new BigDecimal(value);
    }

    public BigDecimal getValue() {
        return value;
    }

}

如果我迭代这个枚举的所有值,这就是代码的样子

for (HardCurrency curr : HardCurrency.values()) {
    logger.debug("{}", curr.getValue());
}

这给出了以下输出

[main] DEBUG c.p.v.ListAllValuesOfEnum - 1
[main] DEBUG c.p.v.ListAllValuesOfEnum - 5
[main] DEBUG c.p.v.ListAllValuesOfEnum - 10
[main] DEBUG c.p.v.ListAllValuesOfEnum - 20
[main] DEBUG c.p.v.ListAllValuesOfEnum - 50
[main] DEBUG c.p.v.ListAllValuesOfEnum - 100
[main] DEBUG c.p.v.ListAllValuesOfEnum - 500
[main] DEBUG c.p.v.ListAllValuesOfEnum - 2000

我需要反过来让它们以递减值迭代。

以保证顺序列出枚举的所有值的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

我认为最好的方法是创建Comparator实现并使用它来对值进行排序。 您可以按如下方式定义反比较器:

import java.math.BigDecimal;
import java.util.Comparator;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class MyClass {
    public static void main(String args[]) {
        List<HardCurrency> hardCurrencies = Arrays.asList(HardCurrency.values());
        Collections.sort(hardCurrencies, new HardCurrencyInverseComparator());
        for (HardCurrency hc : hardCurrencies) {
            System.out.println(hc.getValue());
        }
    }

    enum HardCurrency {
        ONE(1), FIVE(5), TEN(10), TWENTY(20), FIFTY(50), HUNDRED(100), FIVE_HUNDRED(
                500), TWO_THOUSAND(2000);

        private final BigDecimal value;

        HardCurrency(int value) {
            this.value = new BigDecimal(value);
        }

        public BigDecimal getValue() {
            return value;
        }

    }

    static class HardCurrencyInverseComparator implements Comparator<HardCurrency> {

        public int compare(HardCurrency currency1, HardCurrency currency2) {
            return currency2.getValue().compareTo(currency1.getValue());
        }

    }




}

答案 1 :(得分:2)

数组的顺序取决于源代码中定义的顺序。但是你不应该依赖它,因为它可能在未来发生变化,或者因为期望不同顺序的用例冲突。

保证降序的最干净的解决方案是按值显式排序。要进行排序,您需要提供Comparator。定义这样一个Comparator的Java 8方法是单行的:

Comparator.comparing(HardCurrency::getValue).reversed()

答案 2 :(得分:-2)

我已经测试了以下代码并正常运行:

    Comparator comparator1 = new Comparator<HardCurrency>() {

        public int compare(HardCurrency e1, HardCurrency e2) {

            if (e1.getValue().intValue() > e2.getValue().intValue()) {
                return -1;
            } else if (e1.getValue().intValue() < e2.getValue().intValue()) {
                return 1;
            }

            return 0;
        }
    };
    HardCurrency[] allCurrency = HardCurrency.values();
    Arrays.sort(allCurrency,comparator1);

    for (HardCurrency curr : allCurrency) {
        System.out.println(curr.getValue());
    }