あなたの目的のために、ある程度の経験を持つ人物を表すオブジェクトが本当に必要なように思えます。入力ソースには非正規化されたデータがあるため、これを行う最も簡単な方法は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 ごとに、ジョブを経験順にソートしたいので、順序Person.addJob
を維持するように実装する必要があります。SortedSetはこれを行うための非常に優れた方法ですが、重複を挿入することはできません。また、経験で並べ替えたい場合、ある人が 2 つの仕事に同じ時間従事している可能性があるため、別のアプローチを使用する必要があります。 . これを行うにはいくつかの方法がありますが、データについて仮定をせずに、並べ替えられたオブジェクトを保持することをお勧めし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);
}
}
そして最後に、あなたがそれを調べることができるように、 aJob
を実装する必要があります: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
ます。( Collections.binarySearchを参照)。List