/* package whatever; // don't place package name! */
import java.time.LocalDate;
import java.time.Month;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
import java.util.stream.Collectors;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
private static final List
<Unique
> uniqueList
= Arrays.
asList( new Unique("a", null)
,new Unique("b", null)
,new Unique("b", LocalDate.of(2016, Month.SEPTEMBER, 20))
,new Unique("c", LocalDate.of(2016, Month.SEPTEMBER, 19))
,new Unique("c", LocalDate.of(2016, Month.SEPTEMBER, 20))
);
public static void main
(String[] args
) {
System.
out.
println("list ordered, with duplicates: "); uniqueList.
stream().
sorted().
forEach(System.
out::println
);
System.
out.
println("================="); System.
out.
println("list ordered, duplicates removed: "); Comparator<Unique> uniqueComp = (a, b) -> a.getName().compareTo( b.getName() );
TreeSet<Unique> sortedFilterd = uniqueList.stream().sorted().collect(Collectors.toCollection(() -> new TreeSet<Unique>(uniqueComp)));
sortedFilterd.
forEach(System.
out::println
); }
public static class Unique implements Comparable<Unique>
{
private LocalDate dateOfDeletion;
public Unique
(String name, LocalDate dateOfDeletion
) {
this.name = name;
this.dateOfDeletion = dateOfDeletion;
}
return name;
}
public void setName
(String name
) { this.name = name;
}
public LocalDate getDateOfDeletion() {
return dateOfDeletion;
}
public void setDateOfDeletion(LocalDate dateOfDeletion) {
this.dateOfDeletion = dateOfDeletion;
}
@Override
return "Unique [name=" +name + ", dateOfDeletion="+dateOfDeletion+"],";
}
/**
* order based on name ascending, and date descending
*/
@Override
public int compareTo(Unique rhs) {
Comparator<Unique> reverseDateComparator = (a, b) -> {
LocalDate thisDodel = a.getDateOfDeletion() == null ? LocalDate.now().plusDays(1) : a.getDateOfDeletion();
LocalDate thatDodel = b.getDateOfDeletion() == null ? LocalDate.now().plusDays(1) : b.getDateOfDeletion();
return thatDodel.compareTo(thisDodel);
};
return Comparator.
comparing(Unique
::getName
).
thenComparing(reverseDateComparator
).
compare(this, rhs
); }
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGU7CmltcG9ydCBqYXZhLnRpbWUuTW9udGg7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwppbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwoKLyogTmFtZSBvZiB0aGUgY2xhc3MgaGFzIHRvIGJlICJNYWluIiBvbmx5IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMuICovCmNsYXNzIElkZW9uZQp7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFVuaXF1ZT4gdW5pcXVlTGlzdCA9IEFycmF5cy5hc0xpc3QoCgkJCSBuZXcgVW5pcXVlKCJhIiwgbnVsbCkgCgkJCSxuZXcgVW5pcXVlKCJiIiwgbnVsbCkgCgkJCSxuZXcgVW5pcXVlKCJiIiwgTG9jYWxEYXRlLm9mKDIwMTYsIE1vbnRoLlNFUFRFTUJFUiwgMjApKQoJCQksbmV3IFVuaXF1ZSgiYyIsIExvY2FsRGF0ZS5vZigyMDE2LCBNb250aC5TRVBURU1CRVIsIDE5KSkKCQkJLG5ldyBVbmlxdWUoImMiLCBMb2NhbERhdGUub2YoMjAxNiwgTW9udGguU0VQVEVNQkVSLCAyMCkpCgkJCSk7CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIAoJewoJCVN5c3RlbS5vdXQucHJpbnRsbigibGlzdCBvcmRlcmVkLCB3aXRoIGR1cGxpY2F0ZXM6ICIpOwoJCXVuaXF1ZUxpc3Quc3RyZWFtKCkuc29ydGVkKCkuZm9yRWFjaChTeXN0ZW0ub3V0OjpwcmludGxuKTsKCQkKCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09Iik7CgkJU3lzdGVtLm91dC5wcmludGxuKCJsaXN0IG9yZGVyZWQsIGR1cGxpY2F0ZXMgcmVtb3ZlZDogIik7CgkJQ29tcGFyYXRvcjxVbmlxdWU+IHVuaXF1ZUNvbXAgPSAoYSwgYikgLT4gYS5nZXROYW1lKCkuY29tcGFyZVRvKCBiLmdldE5hbWUoKSApOwoJCVRyZWVTZXQ8VW5pcXVlPiBzb3J0ZWRGaWx0ZXJkID0gdW5pcXVlTGlzdC5zdHJlYW0oKS5zb3J0ZWQoKS5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKCgpIC0+IG5ldyBUcmVlU2V0PFVuaXF1ZT4odW5pcXVlQ29tcCkpKTsKCQlzb3J0ZWRGaWx0ZXJkLmZvckVhY2goU3lzdGVtLm91dDo6cHJpbnRsbik7Cgl9CglwdWJsaWMgc3RhdGljIGNsYXNzIFVuaXF1ZSBpbXBsZW1lbnRzIENvbXBhcmFibGU8VW5pcXVlPgoJewoJCXByaXZhdGUgU3RyaW5nIG5hbWU7CgkJcHJpdmF0ZSBMb2NhbERhdGUgZGF0ZU9mRGVsZXRpb247CgkJCgkJcHVibGljIFVuaXF1ZShTdHJpbmcgbmFtZSwgTG9jYWxEYXRlIGRhdGVPZkRlbGV0aW9uKSAKCQl7CgkJCXRoaXMubmFtZSA9IG5hbWU7CgkJCXRoaXMuZGF0ZU9mRGVsZXRpb24gPSBkYXRlT2ZEZWxldGlvbjsKCQl9CgkJCgkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewoJCQlyZXR1cm4gbmFtZTsKCQl9CgoJCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKCQkJdGhpcy5uYW1lID0gbmFtZTsKCQl9CgoJCXB1YmxpYyBMb2NhbERhdGUgZ2V0RGF0ZU9mRGVsZXRpb24oKSB7CgkJCXJldHVybiBkYXRlT2ZEZWxldGlvbjsKCQl9CgoJCXB1YmxpYyB2b2lkIHNldERhdGVPZkRlbGV0aW9uKExvY2FsRGF0ZSBkYXRlT2ZEZWxldGlvbikgewoJCQl0aGlzLmRhdGVPZkRlbGV0aW9uID0gZGF0ZU9mRGVsZXRpb247CgkJfQoKCQlAT3ZlcnJpZGUKCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewoJCQkgcmV0dXJuICJVbmlxdWUgW25hbWU9IiArbmFtZSArICIsIGRhdGVPZkRlbGV0aW9uPSIrZGF0ZU9mRGVsZXRpb24rIl0sIjsKCQl9CgoJCS8qKgoJCSAqIG9yZGVyIGJhc2VkIG9uIG5hbWUgYXNjZW5kaW5nLCBhbmQgZGF0ZSBkZXNjZW5kaW5nCgkJICovCgkJQE92ZXJyaWRlCgkJcHVibGljIGludCBjb21wYXJlVG8oVW5pcXVlIHJocykgewkKCQkJQ29tcGFyYXRvcjxVbmlxdWU+IHJldmVyc2VEYXRlQ29tcGFyYXRvciA9IChhLCBiKSAtPiB7CgkJCQlMb2NhbERhdGUgdGhpc0RvZGVsID0gYS5nZXREYXRlT2ZEZWxldGlvbigpID09IG51bGwgPyBMb2NhbERhdGUubm93KCkucGx1c0RheXMoMSkgOiBhLmdldERhdGVPZkRlbGV0aW9uKCk7CgkJCQlMb2NhbERhdGUgdGhhdERvZGVsID0gYi5nZXREYXRlT2ZEZWxldGlvbigpID09IG51bGwgPyBMb2NhbERhdGUubm93KCkucGx1c0RheXMoMSkgOiBiLmdldERhdGVPZkRlbGV0aW9uKCk7CgkJCQlyZXR1cm4gdGhhdERvZGVsLmNvbXBhcmVUbyh0aGlzRG9kZWwpOwoJCQl9OwoJCQlyZXR1cm4gQ29tcGFyYXRvci5jb21wYXJpbmcoVW5pcXVlOjpnZXROYW1lKS50aGVuQ29tcGFyaW5nKHJldmVyc2VEYXRlQ29tcGFyYXRvcikuY29tcGFyZSh0aGlzLCByaHMpOwoJCX0KCX0KfQ==
list ordered, with duplicates:
Unique [name=a, dateOfDeletion=null],
Unique [name=b, dateOfDeletion=null],
Unique [name=b, dateOfDeletion=2016-09-20],
Unique [name=c, dateOfDeletion=2016-09-20],
Unique [name=c, dateOfDeletion=2016-09-19],
=================
list ordered, duplicates removed:
Unique [name=a, dateOfDeletion=null],
Unique [name=b, dateOfDeletion=null],
Unique [name=c, dateOfDeletion=2016-09-20],