出于您的目的,听起来您真的想要一个对象来代表一个具有一定经验的人。Map<String,Person>
由于您的输入源具有非规范化的数据,因此最简单的方法是在解析文件时填充 a :
scanner.useDelimiter(",|\\n");
while (scanner.hasNext()) {
String line = scanner.next();
String[] fields = line.split(",");
String name = fields[0];
Person person = map.get(name);
if (person == null) {
person = new Person(name);
map.put(name, person);
}
person.addJob(fields[1], Integer.parseInt(fields[2]));
}
List<Person> people = new ArrayList<Person>(map.values());
在此过程之后,您将得到一个人员列表,没有特定的顺序。对于每个人,由于您希望按经验对他们的工作进行排序,因此您需要Person.addJob
以保持其有序的方式实施。SortedSet是一种非常好的方法,但是您不能插入重复项,并且由于您想根据经验进行排序,并且一个人可能在两份工作上花费相同的时间,您需要使用另一种方法. List
有几种方法可以做到这一点,但在不对您的数据进行假设的情况下,我建议保留排序Job
对象:
class Person {
private final List<Job> jobs = new LinkedList<Job>();
// Constructor, etc...
public void addJob(String companyName, int yearsOfExperience) {
Job newJob = new Job(companyName, yearsOfExperience);
int insertionIndex = Collections.binarySearch(jobs, newJob);
if (insertionIndex < 0) {
insertionIndex = (-(insertionIndex) - 1);
}
jobs.add(insertionIndex, newJob);
}
}
最后, a Job
should implement Comparable<Job>
,以便您查找它:
class Job implements Comparable<Job> {
private final String companyName;
private final int yearsOfExperience;
// Constructor, etc...
public int compareTo(Job otherJob) {
return Integer.compare(yearsOfExperience,otherJob.yearsOfExperience);
}
}
里面的那一点诡计Person.addJob
将List
始终按约伯的“自然顺序”排序。(参见Collections.binarySearch)。