我有印度货币的枚举。
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
我需要反过来让它们以递减值迭代。
以保证顺序列出枚举的所有值的最佳方法是什么?
答案 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());
}