Взять список перечислений с несколькими атрибутами и поместить их в ArrayList или HashMap? - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть класс людей Enum, каждый enum которого определяется как:

enumName(String name, String age, String Occupation)

Пример:

public enum People{
    Joe1("Joe","31","Engineer"),
    Joe2("Joe","35","Manager"),
    Sam1("Sam", "22", "Student"),
    Sam1("Sam", "22", "Student"),
    Sam1("Sam", "23", "Student"),
    Sam2("Sam", "30", "lawyer"),
    Sam3("Sam", "45", "judge");
}

Это Joe1 и Joe2 представляют данные для одного и того же человека,Джо, но для другого возраста / профессии.Как я могу сделать ArrayList или Hashmap / таблицу имен вместе с различными возрастами / профессиями, которые можно искать по имени человека?

Так что я не уверен, как будет выглядеть структура данных или даже если она правильная, но я хочу иметь возможность искать имя и получать все возрастные и родовые значения, связанные с этим именем,так, например, я буду искать «Джо» и получать это возвращаемое значение:

Joe-31-Engineer
Joe-35-Manager

Для значений Сэма есть дубликаты, но я все еще хочу иметь возможность видеть их, когда я ищу имя Сэма «Сэм»:

 Sam-22-Student
 Sam-22-Student
 Sam-23-Student
 Sam-30-lawyer
 Sam-45-judge

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Вы можете создать статическую переменную внутри перечисления, которая инициализируется группой людей с помощью personName:

enum People {
    Joe1("Joe", "31", "Engineer"), 
    Joe2("Joe", "35", "Manager"), 
    Sam1("Sam", "22", "Student"),
    Sam2("Sam", "30", "lawyer"), 
    Sam3("Sam", "45", "judge");

    private String personName;
    private String age;
    private String occupations;

    private static Map<String, List<People>> byName;

    static {
        byName = Arrays.stream(values())
                .collect(Collectors.groupingBy(People::getPersonName, 
                          Collectors.toList()));
    }

    People(String personName, String age, String occupations) {
        this.personName = personName;
        this.age = age;
        this.occupations = occupations;
    }
    public static List<People> getByName(String personName) {
             return byName.get(personName);
    }
}

Затем вы можете искать людей (возраст, профессия) по имени с помощью следующего объявления:

 List<People> p = People.getByName("Joe");
0 голосов
/ 24 февраля 2019

Вы можете иметь Map<String, List<People>>.Для каждого имени у вас будет соответствующее значение, представляющее собой список enum значений с этим именем.Вы также не можете иметь более одного значения перечисления с одним и тем же именем, поэтому может быть только одно Sam1.

...