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

时间:2018-07-16 16:12:07

标签: java lambda comparator treeset sortedset

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。

4 个答案:

答案 0 :(得分:1)

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

Here Is The Complete Solution With Output

答案 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语句中,您还可以添加其他可能要排序的变量。