2017-03-12 2 views
0

인도 통화에 대한 열거 형을 사용하고 있습니다. 코드가감소하는 값의 순서로 enum의 모든 값을 반복합니다.

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 

내가 그것을 얻을 필요가 다음과 같은 출력을 제공하는 방법을

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; 
    } 

} 

나는이 열거의 모든 값을 반복하는 경우이있다 다른 방법은 반올림하고 값을 줄이면 반복됩니다.

보장 된 순서로 열거 형의 모든 값을 나열하는 가장 좋은 방법은 무엇입니까?

+0

당신이 라운드 –

+1

이 선언 순서에 의존하지 않는 다른 방법으로 무엇을 의미합니까 분명히 당신은 오름차순 순서로 반복 싶어도 : 이러한 비교기를 정의하는 자바 8 방법은 한 줄입니다 . 관심있는 특성에 따라 주문하는 'Comparator'를 쓴다. 값. –

답변

1

가장 좋은 방법은 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()); 
     } 

    } 




} 
+0

감사합니다. 이것은 효과가 있었다. –

-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()); 
    } 
+2

당신은 BigDecimal 인스턴스를 비교할 수 있습니다 : e1.getValue(). compareTo (e2.getVaue()) – vhula

+0

예 알아요. – Murad

2

순서는 소스 코드에 정의 된 순서에 따라 달라집니다. 그러나 미래에 변경 될 수 있기 때문에 또는 다른 순서를 예상하는 상충되는 유스 케이스 때문에 그것이 의존해서는 안됩니다.

내림차순을 보장하는 가장 깨끗한 해결책은 값으로 명시 적으로 정렬하는 것입니다. 정렬하려면 Comparator을 제공해야합니다.

Comparator.comparing(HardCurrency::getValue).reversed() 
관련 문제