TreeSet使用时拒绝踩坑

     前天在写一道跟TreeSet相关的题目是,刚读题觉得就是一道普通简单的程序题,拿来复习一下相关的知识点。结果写完运行后一直得不到预期的结果,看了TreeSet的源码和TreeSet的contain()方法的源码后找到了问题所在:
题目:

    我写的代码如下:
public class Iphone {
// 定义一个手机类,包含手机品牌,价格,封装该类的属性,并定义该类的有参构造方法实现对属性的赋值,

 private String trademark; //品牌
 private int price; //价格
 private String name; //型号

public String getTrademark() {
 return trademark;
}
public void setTrademark(String trademark) {
 this.trademark = trademark;
}

public int getPrice() {
 return price;
}
public void setPrice(int price) {
 this.price = price;
}

public String getName() {
 return name;
}
public void setName(String name) {
 this.name = name;
}

@Override
public String toString() {
 return "Iphone [trademark=" + trademark + ", price=" + price + ", name=" + name + "]";
}
public Iphone(String trademark,int price, String name) {
 super();
 this.trademark = trademark;
 this.price = price;
 this.name = name;
}
@Override
public int hashCode() {
 final int prime = 31;
 int result = 1;
 result = prime * result + ((name == null) ? 0 : name.hashCode());
 result = prime * result + ((trademark == null) ? 0 : trademark.hashCode());
 return result;
}
@Override
public boolean equals(Object obj) {
 if (this == obj)
  return true;
 if (obj == null)
  return false;
 if (getClass() != obj.getClass())
  return false;
 Iphone other = (Iphone) obj;
 if (name == null) {
  if (other.name != null)
   return false;
 } else if (!name.equals(other.name))
  return false;
 if (trademark == null) {
  if (other.trademark != null)
   return false;
 } else if (!trademark.equals(other.trademark))
  return false;
 return true;
}
public Iphone() {
 super();
 // TODO Auto-generated constructor stub
}


}
public class MyComparator implements Comparator {


 public int compare(Object o1, Object o2) {
  if(o1 instanceof Iphone && o2 instanceof Iphone){
   Iphone i1=(Iphone)o1;
   Iphone i2=(Iphone)o2;
   if(i1.getPrice()==i2.getPrice()){
    return 0;
   }else {
       int temp=i1.getPrice()-i2.getPrice();
          return -temp;

   }

  }
  return 0;
 }

}

public class TestIphone {
// 1.定义一个TreeSet对象,创建5个手机类对象将五个对象依次存放到TreeSet中。
// 2.自定义一个比较器(按照价格降序排列),将1中的集合元素按照比较器的顺序进行存放。
// 3.键盘输入手机的品牌和型号,如果没有则将该品牌和型号添加到集合中,如果存在则删除该元素。判断TreeSet集合中是否存在对应品牌和型号的手机.
// 4.使用迭代输出该集合类中的所有元素。
public static void main(String[] args) {

 TreeSet<Iphone> treeSet = new TreeSet<Iphone>(); //new MyComparator()
 Iphone ip1 = new Iphone("s", 1400, "y");
 Iphone ip2 = new Iphone("华为", 1300, "荣耀6");
 Iphone ip5 = new Iphone("三星1", 1460, "graly");
 Iphone ip6 = new Iphone("三星2", 1480, "graly");
 treeSet.add(ip1);
 treeSet.add(ip2);
 treeSet.add(ip5);
 treeSet.add(ip6);
 // System.out.println(treeSet);

 Iphone iphone = new Iphone();

 Scanner input1 =new Scanner(System.in);
 System.out.println("请输入产品的品牌:");
 iphone.setTrademark(input1.nextLine());

 Scanner input2 =new Scanner(System.in);
 System.out.println("请输入产品的名称:");
 iphone.setName(input2.nextLine());
 iphone.setPrice(1460); //1480

 System.out.println(treeSet.contains(iphone)); //如果包含指定的元素返回true

  treeSet.add(iphone);

 System.out.println("遍历:");
 Iterator<Iphone> it = treeSet.iterator();
    while(it.hasNext()){
     System.out.println(it.next());
    }


}
}
     当我输入产品品牌s,y我想要的结果是添加不进去,但是结果是依旧会进行添加。我的treeSet.contains(iphone)打印结果是flase。
     那么为什么treeSet.contains(iphone)打印结果是flase?下边我们来看一张图:

     相信看了这张图你一定理解了为什么treeSet.contains(iphone)打印结果是flase。
    一直以来理解Set集合的特点是无序不重复,而判断无序不重复是根据Hashcode()和equals(),那么重写这两个方法就可以了。在使用TreeSet自定义比较器是在对象添加进集合中才进行排序??? 在使用Arrays对数组中的元素进行排序的时候,可以传递一个比较器。 在使用Collections对集合中的元素进行排序的时候,可以传递一个比较器。 那么在使用TreeSet对加入到其中的元素进行排序的时候可以传入一个比较器吗?比较器是在什么时候起作用呢?
public TreeSet(Comparator<? super E> comparator) {

this ( new TreeMap<E,Object> (comparator));
    }
    }
    通过查看它的构造方法就知道可以传入一个比较器。

    构造一个新的空TreeSet,它根据指定比较器进行排序。插入到该 set 的所有元素都必须能够由指定比较器进行相互比较:对于 set 中的任意两个元素 e1 和e2,执行 comparator.compare(e1, e2) 都不得抛出 ClassCastException。如果用户试图将违反此约束的元素添加到 set 中,则 add 调用将抛出 ClassCastException。

    Comparator comparator();如果TreeSet采用了定制排序,则该方法返回定制排序所使用Comparator;如果TreeSet采用了自然排序,则返回null;

  


    


猜你喜欢

转载自blog.csdn.net/rvvvvvvhqq/article/details/79878019