为什么TreeSet在不相等时会删除重复项?

时间:2014-05-06 08:32:56

标签: java collections

朋友们,我在使用TreeSet获取整个数据时遇到问题。我已将TreeSet排序为相同的值。

这是我的代码:

MyCars上课:

class MyCars implements Comparable<MyCars>{

    private String number;
    private int yearModel;
    private double horsePower;

    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
    public int getYearModel() {
        return yearModel;
    }
    public void setYearModel(int yearModel) {
        this.yearModel = yearModel;
    }
    public double getHorsePower() {
        return horsePower;
    }
    public void setHorsePower(double horsePower) {
        this.horsePower = horsePower;
    }
    @Override
    public int compareTo(MyCars c) {
        return Double.compare(this.horsePower,c.getHorsePower());
    }
}

SortTest上课:

public class SortTest {

    void GoForSort(){
        Set dataStructure=new TreeSet();

        MyCars c1=new MyCars();
        c1.setNumber("SRT-Viper123");
        c1.setYearModel(2013);
        c1.setHorsePower(450.00);

        MyCars c2=new MyCars();
        c2.setNumber("Chevrolet-Corvette901");
        c2.setYearModel(2012);
        c2.setHorsePower(450.00);

        MyCars c3=new MyCars();
        c3.setNumber("Ford-Mustang678");
        c3.setYearModel(2014);
        c3.setHorsePower(455.00);

        dataStructure.add(c1);
        dataStructure.add(c2);
        dataStructure.add(c3);

        Iterator<MyCars> it=dataStructure.iterator();
        while(it.hasNext()){
            MyCars c=it.next();
            System.out.println(c.getNumber()+"\t"+c.getHorsePower()+"\t"+c.getYearModel());
        }

    }
    public static void main(String[] args) {
        SortTest st=new SortTest();
        st.GoForSort();

    }

}

正如您所看到的,我已根据horsePower对TreeSet进行了排序。而且我已经将马力的SAME值赋予了两个物体。

以下是我得到的输出:

SRT-Viper123    450.0   2013
Ford-Mustang678 455.0   2014

但我也希望Chevrolet-Corvette901进入这组输出。为什么我没有得到它。

还有什么方法可以包含它吗?因为我发现当我将我的收藏改为ArrayList时没有问题。 TreeSet只对唯一元素进行排序吗?

有没有任何技巧可以得到&amp;无论Iteration ...

中的唯一性如何,都会在TreeSet期间打印所有对象

6 个答案:

答案 0 :(得分:2)

设置不存储重复的元素。 如果您要存储两辆车,则应更改equalscompareTo方法以比较其数量。然后两个条目都不同。

请注意,equals方法应与compareTo一致,因此我强烈建议您重写equals方法。

答案 1 :(得分:2)

TreeSetSet的子项,并且集合不存储重复值。以下是java docs

中set的定义
  

不包含重复元素的集合。更正式的,集合   不包含元素e1和e2对,使得e1.equals(e2)和at   大多数一个null元素。正如其名称所暗示的,这个界面模型   数学集抽象。

答案 2 :(得分:1)

仅设置存储唯一元素。

答案 3 :(得分:1)

您有两种选择:

  1. 让您的compareTo也比较numberyearModel字段。

  2. 在每个节点上存储一个集合(数组或List) - 通常称为MultiSet

  3. 只要您的compareTo报告两个项目相同,其中只有一个会出现在该集合中。

答案 4 :(得分:1)

通常使用equals(),所包含对象的唯一性由其Car.equals()方法确定。在您的示例中,您将实现TreeSet,如果它们具有相同的数字,modelYear和horsePower,则两个Cars将是相等的。然后你可以将你的Corvette加入到套装中,它不会与另一个具有相同马力的模型发生冲突。

equals()不同:它确定两个对象相同,而不是true返回compareTo(),而TreeSet返回0.这意味着您可以轻松找到你自己有两个TreeSet视为相同的对象,即使它们不是。

Comparator州的文件确实如此:

  

请注意,如果要正确实现Set接口,则由set维护的排序(无论是否提供显式比较器)必须与equals一致。

换句话说,不破坏Set契约,TreeSet依赖于你只提供一个equals(),它与你放在集合中的对象的Comparator实现一致

由于TreeSet允许您指定任意library("partykit") library("C50") //Creates a sample data frame data <- data.frame(ID = c(1, 2, 3, 4, 5), var1 = c('a', 'b', 'c', 'd', 'e'), var2 = c(1, 1, 0, 0, 1)) //This is the variable I want to predict variable <- "ID" //First I convert the column to factor data[, variable] <- factor(data[, variable]) //Then I create the formula formula <- as.formula(paste(variable, " ~ .")) //And finally I fit the model with the formula model <- C5.0(formula, data=data, trials=10) ,我们可能会更简洁,并说TreeSet会破坏Set契约。

答案 5 :(得分:0)

来自维基百科Set

  

在数学中,集合是不同对象的集合,它本身被视为一个对象。例如,数字2,4和6在单独考虑时是不同的对象,但是当它们被统一考虑时,它们形成一组大小为3,写成{2,4,6}。集是数学中最基本的概念之一。

Set具有不同/唯一的元素,即没有重复。