如何实现具有多个可能重复的字符串属性的枚举类?

时间:2019-02-23 17:51:14

标签: java oop enums hashmap treemap

作为Java OOP中的后台刷新器,我正在尝试一个设计问题:

我有一堆人的名字,还有名字,年龄和职业。我想实现一个ListOfPersons枚举类,该枚举类像具有所有这些信息的数据库。唯一的问题是,此列表中的许多数据都是重复的,因此,例如,年龄和职业属性可能有两个或三个条目。

Example:
Enum object one- 
Name: Joe
Age: 40
Age: 41
Occupation: Engineer
Occupation: Software Engineer

您可以在Joe那里看到两个年龄条目和两个职业条目。

Example 2:
Enum object two- 
Name: Judy
Age: 55
Age: 65
Occupation: Judge

在示例2中,年龄出现了两次。

重点是,必须在枚举类中实现一堆这样的条目。 什么是设置它的最佳方法(我的枚举类),目的是转移到TreeMap或HashMap(或者有更好的数据结构可以用作用户搜索的数据库)人)?

问题是,我不确定如何考虑这些随机重复的条目,这使得以后很难放入数据结构中。

public enum ListOfPersons{
Joe("Joe", 40, 41, "Engineer", "Software Engineer"), Judy("Judy", 55, 65, 
"Judge")...etc.
//methods 
}

4 个答案:

答案 0 :(得分:1)

enum似乎不适合您的情况。一种更简单的方法是拥有一个Person类(需要您的字段),然后重写equals()hashCode()方法以将name包含为唯一标识符(我认为name是唯一的,因为您尝试放置它作为您的枚举示例中的名称)。然后,您使用ArrayList创建一个Person实例列表。

要稍后在Map这样的数据结构(人员名称作为键,人员对象作为值)中进行处理,可以执行以下操作:

Map<String, Person> personsMap = persons.stream()
  .collect(Collectors.toMap(Person::getName, Function.identity());

然后检索:personsMap.get("Joe")为您提供Person实例

答案 1 :(得分:1)

我也会推荐Hashmap,但是如果您坚持使用Enum,可以用类似的方式存储它们

public enum ListOfPersons{
Joe("Joe", "40,41","Engineer,Software Engineer"), Judy("Judy", "55,65","Judge")...etc.
//methods 
}

这样,您将始终获得3个字符串作为值,然后可以应用简单的字符串处理将其转换为数据结构

答案 2 :(得分:0)

对不起,我的英语。

如何在HashMap中使用自定义类?

像这样

used to be

为什么要将其实现为枚举?

答案 3 :(得分:0)

不确定是否需要什么,但是下面的代码中可能有一些有用的提示

import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;
import java.util.Map;
import java.util.TreeMap;

public class Test {
    public static void main(String[] args) {
        // load some test data
        Set<Integer> joesAges = Person.JOE.getAges();
        joesAges.add(21);
        joesAges.add(34);
        joesAges.add(43);

        Set<String> joesOccupations = Person.JOE.getOccupations();
        joesOccupations.add("Engineer");
        joesOccupations.add("Software Engineer");
        joesOccupations.add("Mechanical Engineer");

        // .... and so on for all the names in Person enum

        String searchTerm = "joe occupation"; // hardcoded search terms, it should be replaced with user's input
        String searchTermSeparator = " ";
        int indexOfSearchTermsSeparator = searchTerm.indexOf(searchTermSeparator);
        String searchName = searchTerm;
        String searchDetails = "age"; // initialze with age as default option for search, if user only types a name
        if (indexOfSearchTermsSeparator > -1) {
            searchName = searchTerm.substring(0, indexOfSearchTermsSeparator);
            searchDetails = searchTerm.substring(indexOfSearchTermsSeparator + 1);
        }
        try {
            Person person = Person.valueOf(searchName.toUpperCase());
            if ("age".equals(searchDetails)) {
                // list all ages for searched name
                String agesString = person.getAges()
                                          .stream()
                                          .map(age -> {return "" + age;})
                                          .collect(Collectors.joining( ", age: " ));

                System.out.println(searchName + " age: " + agesString);
            } else {
                // list all occupations of searched name
                String occupationsString = person.getOccupations()
                      .stream()
                      .collect(Collectors.joining(", occupation: " ));

                System.out.println(searchName + " occupation: " + occupationsString);
            }
        } catch(Exception e) {
            System.out.println("Unknown name");
        }
    }
}
enum Person {
    JOE(new TreeSet<Integer>(), new TreeSet<String>()),
    JANE(new TreeSet<Integer>(), new TreeSet<String>()),
    JUDY(new TreeSet<Integer>(), new TreeSet<String>())
    //.... and so on for all the names
    ;

    private Set<Integer> ages;
    private Set<String> occupations;

    Person(Set<Integer> ages, Set<String> occupations) {
        this.ages = ages;
        this.occupations = occupations;
    }

    public Set<Integer> getAges() {
        return this.ages;
    }

    public Set<String> getOccupations() {
        return this.occupations;
    }

    public void reset() {
        this.ages = new TreeSet<>();
        this.occupations = new TreeSet<>();
    }
}