In fact you don't need to sort your list. Since minimum order of sorting algorithms is O(n*log(n)). I think the following solution is better, because its order is O(n). It uses a HashMap
to hold minimum initDate and maximum finDate for each Student.
Main class:
package com.stackoverflow;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public Main() {
super();
}
public static void main(String[] args) throws ParseException {
List<Student> list = new ArrayList<Student>();
SimpleDateFormat dateFormat = new SimpleDateFormat("M/d/yyyy");
Student student =
new Student("ABC", dateFormat.parse("2/2/2016"), dateFormat.parse("5/5/2017"));
list.add(student);
student =
new Student("ABC", dateFormat.parse("3/2/2016"), dateFormat.parse("3/30/2017"));
list.add(student);
student =
new Student("CED", dateFormat.parse("1/1/2015"), dateFormat.parse("3/12/2017"));
list.add(student);
student =
new Student("LEF", dateFormat.parse("1/12/2016"), dateFormat.parse("11/17/2017"));
list.add(student);
student =
new Student("CED", dateFormat.parse("1/12/1999"), dateFormat.parse("12/23/2017"));
list.add(student);
student =
new Student("LEF", dateFormat.parse("2/13/2000"), dateFormat.parse("11/19/2017"));
list.add(student);
Map<String, DatePair> map =
new HashMap<String, DatePair>(list.size() / 2);
for (Student st : list) {
DatePair datePair = map.get(st.getName());
if (datePair == null) {
datePair = new DatePair(st.getInitDate(), st.getFinDate());
map.put(st.getName(), datePair);
} else {
if (st.getInitDate().before(datePair.getInitDate()))
datePair.setInitDate(st.getInitDate());
if (st.getFinDate().after(datePair.getFinDate()))
datePair.setFinDate(st.getFinDate());
}
}
for (Map.Entry<String, DatePair> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
Student Class:
package com.stackoverflow;
import java.util.Date;
public class Student {
private String name;
private Date initDate;
private Date finDate;
public Student() {
super();
}
public Student(String name, Date initDate, Date finDate) {
super();
this.name = name;
this.initDate = initDate;
this.finDate = finDate;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setInitDate(Date initDate) {
this.initDate = initDate;
}
public Date getInitDate() {
return initDate;
}
public void setFinDate(Date finDate) {
this.finDate = finDate;
}
public Date getFinDate() {
return finDate;
}
}
DatePair Class:
package com.stackoverflow;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DatePair {
private Date initDate;
private Date finDate;
public DatePair() {
super();
}
public DatePair(Date initDate, Date finDate) {
super();
this.initDate = initDate;
this.finDate = finDate;
}
public void setInitDate(Date initDate) {
this.initDate = initDate;
}
public Date getInitDate() {
return initDate;
}
public void setFinDate(Date finDate) {
this.finDate = finDate;
}
public Date getFinDate() {
return finDate;
}
@Override
public String toString() {
SimpleDateFormat dateFormat = new SimpleDateFormat("M/d/yyyy");
return "(" + dateFormat.format(initDate) + ", " + dateFormat.format(finDate) + ")";
}
}