求教一个java的小问题。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求教一个java的小问题。相关的知识,希望对你有一定的参考价值。
comparable和comparator这两个接口有什么区别?我新手,不是很理解,高人指点一下。
如果一个类已经开发完成,但是在此类的初期并没有实现Comparable接口,此时肯定是无法进行对对象进行排序的,所以为了解决这样的问题Java又定义了另外一个比较器的操作接口Comparator。但是两者的不同之处在于Comparttor接口需要单独指定好一个比较器的比较规则类才可以完成数组的排序,而在Comparable接口中直接覆写CompareTo()方法就可以完成数组排序了。 参考技术A 实际上,所有实现 Comparable 的 Java 核心类都具有与 equals 一致的自然排序。java.math.BigDecimal 是个例外,它的自然排序将值相等但精确度不同的 BigDecimal 对象(比如 4.0 和 4.00)视为相等。为了保证TreeSet能正确地排序,要求Customer类的compareTo()方法与equals()方法按相同的规则比较两个Customer对象是否相等.也就是说,如果customer1.equals(customer2)为True,那么customer1.compareTo(customer2)为0。 既然重写了equals方法 就得重写hashCode()方法这个大家都知道大家看一眼结果便知 这个按照升序排序的 年龄也是按照升序
还有要注意哦,对于TreeSet中已经存在的Customer对象,如果修改了它们的name属性或age属性,则TreeSet不会对集合进行重新排序.例如下边的代码先把customer1和customer2 对象加入到TreeSet集合中,然后修改customer1的age属性
代码:
Java代码 package hang.jihe; import java.util.Iterator; </SPAN></li>import java.util.Set; </SPAN></li>import java.util.TreeSet; </SPAN></li> public class TreeSetTest </SPAN></li> public static void main(String[] args) </SPAN></li> Set<Customer> set = new TreeSet<Customer>(); </SPAN></li> Customer customer1 = new Customer("Tom",15); </SPAN></li> Customer customer2 = new Customer("Tom",16); </SPAN></li> set.add(customer1); set.add(customer2); //customer1.setAge(20);//修改customer1实例的age </SPAN></li> Iterator<Customer> it=set.iterator(); while(it.hasNext()) </SPAN></li> Customer customer=it.next(); System.out.println(customer.getName()+" "+customer.getAge()); </SPAN></li> package hang.jihe; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class TreeSetTest public static void main(String[] args) Set<Customer> set = new TreeSet<Customer>(); Customer customer1 = new Customer("Tom",15); Customer customer2 = new Customer("Tom",16); set.add(customer1); set.add(customer2); //customer1.setAge(20);//修改customer1实例的age Iterator<Customer> it=set.iterator(); while(it.hasNext()) Customer customer=it.next(); System.out.println(customer.getName()+" "+customer.getAge());
上边我先把 Java代码 customer1.setAge(20); customer1.setAge(20);这句注释掉
打印结果是:
Java代码 Tom 15 Tom 16 </SPAN></li>Tom 15 Tom 16 这个是我们要的结果 name 和age都是按照升序排序的
然后我们把那句取消注释之后的打印结果是:
Java代码 Tom 20 Tom 16 </SPAN></li>Tom 20 Tom 16
Tom 20如果按照升序应该在下边 但是却在上边 说明TreeSet没有给它重新排序哦在实际应用中Customer对象的name属性和age属性肯定应该是可以被修改的,因此不适合用TreeSet来排序。那大家也应该能想到最适合用TreeSet排序的就是不可变类了呗 比如Integer,Double,String等 所谓不可变类,是指当创建了这个类的实例后,就不允许修改它的属性值。大家以后用还是小心点好儿!
客户化排序
Comparator这个单词啥意思? 你知道不? 比较器的意思 学好英语还是挺好滴
除了自然排序,TreeSet还支持客户化排序.java.util.Comparator<Type>接口提供具体的排序方式,<Type>指定被比较的对象的类型,Comparator有个compar(Type x,Type y)方法,用于比较两个对象的大小,当compare(x,y)大于0时表示x大于y,小于0表示x小于y
等于0表示x等于y
来个例子如果希望TreeSet按照Customer对象的name属性进行降序排列,可以先创建一个实现Comparator接口的类
代码:
Java代码 package hang.jihe; import java.util.Comparator; </SPAN></li>import java.util.Iterator; </SPAN></li>import java.util.Set; </SPAN></li>import java.util.TreeSet; </SPAN></li> public class CustomerComparator implements Comparator<Customer> </SPAN></li> public int compare(Customer c1, Customer c2) </SPAN></li> if(c1.getName().compareTo(c2.getName())>0)return -1; </SPAN></li> if(c1.getName().compareTo(c2.getName())<0)return 1; </SPAN></li> return 0; </SPAN></li> public static void main(String args[]) </SPAN></li> Set<Customer> set = new TreeSet<Customer>(new CustomerComparator()); </SPAN></li> Customer customer1= new Customer("Tom",15); </SPAN></li> Customer customer3= new Customer("Jack",16); </SPAN></li> Customer customer2= new Customer("Mike",26); </SPAN></li> set.add(customer1); set.add(customer2); set.add(customer3); Iterator<Customer> it = set.iterator(); while(it.hasNext()) </SPAN></li> Customer customer = it.next(); System.out.println(customer.getName()+" "+customer.getAge()); </SPAN></li> package hang.jihe; import java.util.Comparator; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class CustomerComparator implements Comparator<Customer> public int compare(Customer c1, Customer c2) if(c1.getName().compareTo(c2.getName())>0)return -1; if(c1.getName().compareTo(c2.getName())<0)return 1; return 0; public static void main(String args[]) Set<Customer> set = new TreeSet<Customer>(new CustomerComparator()); Customer customer1= new Customer("Tom",15); Customer customer3= new Customer("Jack",16); Customer customer2= new Customer("Mike",26); set.add(customer1); set.add(customer2); set.add(customer3); Iterator<Customer> it = set.iterator(); while(it.hasNext()) Customer customer = it.next(); System.out.println(customer.getName()+" "+customer.getAge());
以上main方法在构造TreeSet的实例时,调用了它的TreeSet(Comparator comparator)构造方法.
Java代码 Set<Customer> set = new TreeSet<Customer>(new CustomerComparator()); Set<Customer> set = new TreeSet<Customer>(new CustomerComparator());这是干甚? 其实就是指定一个比较器 TreeSet集合里边的对象按照这个比较器的规则进行排序 我把TreeSet类的这个构造方法搞上来看看就明白了 TreeSet里边有这样一个构造方法
TreeSet
public TreeSet(Comparator<? super E> comparator)构造一个新的空 TreeSet,它根据指定比较器进行排序。插入到该 set 的所有元素都必须能够由指定比较器进行相互比较:对于 set 中的任意两个元素 e1 和 e2,执行 comparator.compare(e1, e2) 都不得抛出 ClassCastException。如果用户试图将违反此约束的元素添加到 set 中,则 add 调用将抛出 ClassCastException。
参数:
comparator - 将用来对此 set 进行排序的比较器。如果该参数为 null,则使用元素的自然顺序。
最后的打印结果是:
Java代码 Tom 15 Mike 26 </SPAN></li>Jack 16 </SPAN></li>Tom 15 Mike 26 Jack 16 是倒序 ...
那你现在是不知道了comparable接口和comparable接口的区别了并且也能更好的使用TreeSet集合了
总结一下吧
单点解释吧:用自定义类实现Comparable接口,那么这个类就具有排序功能,Comparable和具体你要进行排序的类的实例邦定。而Comparator比较灵活,只需要通过构造方法指定一个比较器就行了实现它的自定义类仅仅定义了一种排序方式或排序规则。不言而喻,这种方式比较灵活。我们的要排序的类可以分别和多个实现Comparator接口的类绑定,从而达到可以按自己的意愿实现按多种方式排序的目的。Comparable——“静态绑定排序”,Comparator——“动态绑定排序”。
在多墨迹一点 说说编写java类时应该养成一些好习惯吧
一: 如果java类重新定义了equals方法,那么这个类也必须重新定义hashCode()方法,并且保证当两个对象用equals方法比较结果为true时,这两个对象的hashCode()方法的返回值相等.
二:如果java类实现了Comparable接口,那么这个类应该从新定义compareTo() equals() 和hashCode()方法,保证compareTo()和equals()方法采用相同的比较规则来比较两个对象是否相等,并且保证当两个对象用equals()方法比较的结果为true时,这两个对象的hashCode()方法的返回值相等.
HashSet和HashMap具有较好的性能,是Set和Map首选实现类,只有在需要排序的场合,才考虑使用TreeSet和TreeMap. LinkedList 和 ArrayList各有优缺点,如果经常对元素执行插入和删除操作,那么可以用LinkedList,如果经常随机访问元素,那么可以用ArrayList. 参考技术B 1.Comparable接口是在java.lang类中的,而Comparator接口是在java.util类中的。
2.Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。
求教关于maven编译找不到java.lang包的问题
就是找不到jre的问题。 1、明确jre的版本 org.apache.maven.plugins maven-compiler-plugin 3.0 1.6 1.6 2、重新引入依赖jar包 maven-->update Projectmaven项目编译的标准输出路径就是mavenProject/target/classes, 项目右键 build path--configure build path--java build path--source,把default output folder改成mavenProject/target/classes,在菜单栏project下把自动编译打勾。 参考技术A http://bbs.csdn.net/topics/391815825?page=1
以上是关于求教一个java的小问题。的主要内容,如果未能解决你的问题,请参考以下文章
关于C++模版的一个问题求教,如果取模板类内的一个结构体的指针。