myData{
itemId,
location,
ExpDtTm,
userId
}
我试图像这样对TreeSet进行排序:
TreeSet<myData> sorted = new TreeSet<>(Comparator.comparing(myData -> myData.ExpDtTm));
但是如果有任何日期相等,就不会将它们添加到树集中,这是一个问题,这是一个问题。如果有人知道该怎么做,将不胜感激。
我也尝试过
TreeSet<myData> sorted = new TreeSet<>(Comparator.comparing(myData -> myData.ExpDtTm).thencomparing(myData -> myData.itemId));
但是它停止了,除了两个lambda都包含myData。
答案 0 :(得分:1)
api
是Set
的实现,它明确禁止设计重复的条目。如果您想要一个包含重复项的排序集合,请使用TreeSet
的实现(例如List
),最后通过调用Collections.sort(myList, Comparator.comparing(myData -> myData.ExpDtTm));
对其进行排序。
答案 1 :(得分:1)
发生这种情况的原因是因为比较器不仅用于确定顺序,而且还用于确定两个对象是否相等(而不是hashCode
使用HashSet
):
TreeSet实例使用其实例执行所有元素比较
compareTo
(或compare
)方法,因此两个元素被视为相等 从集合的角度来看,这种方法是相等的。
如果实际上有两个对象不同,但恰好具有相同的日期,则可以使用对象的identity hash code(实际上是内存地址)作为第二个排序条件:< / p>
TreeSet<myData> sorted =
new TreeSet<>(Comparator.comparing(myData -> myData.ExpDtTm)
.thenComparingInt(System::identityHashCode));
答案 2 :(得分:1)
Employee.Java
private String name;
public Employee(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public String toString() {
return "Employee[ id=" + name + "]";
}
驱动程序类
TreeSetTest.Java
TreeSet<Employee> treeSet = new TreeSet<>(new Comparator<Employee>() {
@Override
public int compare(Employee o1, Employee o2) {
int index = o1.getName().compareTo(o2.getName());
return index==0?1:index;
}
});
treeSet.add(new Employee("Harvansh"));
treeSet.add(new Employee("Harvansh1"));
treeSet.add(new Employee("Harvansh"));
treeSet.add(new Employee("Harvansh2"));
treeSet.add(new Employee("Harvansh"));
treeSet.add(new Employee("Harvansh3"));
treeSet.add(new Employee("Harvansh"));
treeSet.forEach(System.out::println);
输出
Employee [id = Harvansh]
Employee [id = Harvansh]
Employee [id = Harvansh]
Employee [id = Harvansh]
Employee [id = Harvansh1]
Employee [id = Harvansh2]
Employee [id = Harvansh3]
答案 3 :(得分:0)
这就是我最终要做的:
final SortedSet<myData> sorted = new TreeSet<>(new Comparator<myData>() {
@Override
public int compare(myData o1, myData o2) {
int comparedValue = o1.expDtTm.compareTo(o2.expDtTm);
if(comparedValue == 0){
comparedValue = 1;
}
}
});
在该compareValue if
语句中,您还可以添加其他可能要排序的变量。