繁体   English   中英

对树集进行排序而不删除重复项

[英]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除外。

TreeSetSet一个实现,它明确禁止设计重复的条目。 如果你想要一个包含重复项的排序集合,请使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM