[英]Sorting tree sets without removing duplicates
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除外。
TreeSet
是Set
一个实现,它明确禁止设计重复的条目。 如果你想要一个包含重复项的排序集合,请使用List
的实现(例如ArrayList
),并通过调用Collections.sort(myList, Comparator.comparing(myData -> myData.ExpDtTm));
在最后对它进行排序Collections.sort(myList, Comparator.comparing(myData -> myData.ExpDtTm));
。
发生这种情况的原因是因为比较器不仅用于确定顺序,还用于确定两个对象是否相等(而不是HashSet
将使用的hashCode
):
TreeSet实例使用
compareTo
(或compare
)方法执行所有元素比较,因此从集合的角度来看,这个方法认为相等的两个元素是相等的。
如果你有两个实际上不相同但恰好具有相同日期的对象,你可以使用对象的标识哈希码 (实际上是它的内存地址)作为二级排序条件:
TreeSet<myData> sorted =
new TreeSet<>(Comparator.comparing(myData -> myData.ExpDtTm)
.thenComparingInt(System::identityHashCode));
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);
产量
员工[id = Harvansh]
员工[id = Harvansh]
员工[id = Harvansh]
员工[id = Harvansh]
员工[id = Harvansh1]
员工[id = Harvansh2]
员工[id = Harvansh3]
这就是我最终做的事情:
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
语句中,您可以添加您可能想要排序的任何其他变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.