作为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
}
答案 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<>();
}
}