2017-05-28 1 views
5

J'ai une affectation pour écrire un Enum "Weekdays" dont les constantes sont avec plus d'un paramètre.

Est-ce que le type Enum a un court chemin pour itérer sur ses valeurs par leur propriété (1,2,3,4,5,6,7 - de mon code) ou je dois écrire un autre type de données où stocker le les données demandées?
C'est mon code:Comment itérer sur une énumération par sa valeur int?

public enum Weekdays { 
    MON("Monday", "Mon",1), 
    TUE("Tuesday","Tue",2), 
    WED("Wednesday","Wed",3), 
    THU("Thursday","Thu",4), 
    FRI("Friday", "Fri",5), 
    SAT("Saturday","Sat",6), 
    SUN("Sunday","Sun",7); 

    private String fullName; 
    private String shortName; 
    private int number; 

    Weekdays(String fullName, String shortName, int number) { 
     this.fullName = fullName; 
     this.shortName = shortName; 
     this.number = number; 
    } 

    public String getFullName() { 
     return fullName; 
    } 

    public String getShortName() { 
     return shortName; 
    } 

    public int getNumber() { 
     return number; 
    } 
} 

Le problème est que le code doit itérer sur une valeur qui est définie par l'utilisateur, donc je ne peux pas simplement itérer sur l'ENUM de son début à la fin.

Modifier parce que je pense que je ne l'explique pas bien:
Le code doit itérer sur une valeur int entrée par l'utilisateur et d'imprimer par exemple la propriété-d'une autre constante: lorsque l'entrée de l'utilisateur est 4, le programme devrait imprimer:

Thursday, Friday, Saturday, Sunday, Monday, Thuesday, Wednesday 

Répondre

2

Vous pouvez obtenir toutes les valeurs enum par values() et les faire correspondre à des valeurs de filtrage Weekdays::getNumber qui sont inférieurs à la userInput:

Arrays.stream(Weekdays.values()) 
     .mapToInt(Weekdays::getNumber) 
     .filter(i -> i > userInput) 
     .forEach(i -> { /**/ }); 

Pour plus d'efficacité, vous pourriez également tenir le tableau tracé dans un champ statique:

private static int[] numbers = Arrays.stream(Weekdays.values()).mapToInt(Weekdays::getNumber).toArray(); 

et l'utiliser quand il a besoin:

public void method(int userInput) { 
    // validate userInput 
    for (int i = userInput; i < numbers.length; i++) { 
     // do sth with numbers[i] 
    } 
} 

EDIT:
J'ai attrapé vos besoins dans le commentaire, ici est la solution que je vois:

public void method(int userInput) { 
    // validate userInput 
    Weekdays[] values = Weekdays.values(); 

    for (int i = userInput; i < values.length + userInput; ++i) { 
     Weekdays day = values[i % values.length]; 
     System.out.println(day.getFullName()); 
    } 
} 
+0

Merci beaucoup, ça aide vraiment! –