求教一个java的小问题。

作者&投稿:威剂 (若有异议请与网页底部的电邮联系)
求教一个java小问题~

因为并不存在Component的预定义事件中,也是不该用的。
所写的mouseClicked方法仅仅相当于一个自定义的、未被调用过的方法。
请另外在该Applet类上实现MouseListener监听吧
import java.applet.Applet;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class Test extends Applet implements MouseListener{
int count = 0;
public void init()
{
addMouseListener(this);
}
@Override public void mouseClicked(MouseEvent e)
{
this.count++;
getAppletContext().showStatus("你好,你已经点击"+this.count+"次了");
}
@Override public void mousePressed(MouseEvent e) {}
@Override public void mouseReleased(MouseEvent e) {}
@Override public void mouseEntered(MouseEvent e) {}
@Override public void mouseExited(MouseEvent e) {}
}

你想问什么啊,程序没有问题啊,输出也没有问题啊

如果一个类已经开发完成,但是在此类的初期并没有实现Comparable接口,此时肯定是无法进行对对象进行排序的,所以为了解决这样的问题Java又定义了另外一个比较器的操作接口Comparator。但是两者的不同之处在于Comparttor接口需要单独指定好一个比较器的比较规则类才可以完成数组的排序,而在Comparable接口中直接覆写CompareTo()方法就可以完成数组排序了。

实际上,所有实现 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.

1.Comparable接口是在java.lang类中的,而Comparator接口是在java.util类中的。
2.Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。


学习java需要什么课程呀
第1课 Java开发环境安装与配置 第2课 第一个Java程序 第3课 面向对象基础 第4课 基本数据类型 第5课 运算符 第6课 字符串操作 第7课 程序的控制流 第8课 静态变量与静态方法 第9课 Java集合 第10课 封装与继承 第11课 抽象类与接口 第12课 异常处理 第13课 综合实例 第14课 Eclipse的安...

求教JAVA学习的技巧!
先学习基础知识:Java 是一门复杂的编程语言,建议先学习一些基础知识,如语法、数据类型、控制流程、函数和面向对象编程等。实践是关键:Java 学习最重要的部分是实践。尝试编写一些简单的程序,然后逐渐提高难度,挑战自己。可以尝试解决一些常见的编程问题或挑战。阅读源代码:学习 Java 时可以阅读一些开源...

Java怎么学习 入门Java编程的指南?
1. 学习基本的编程概念和术语:了解编程中常用的概念,例如变量、数据类型、条件语句、循环语句等。可以通过阅读相关书籍或在线教程来学习。2. 安装和配置Java开发环境:下载和安装Java Development Kit(JDK),并配置环境变量。JDK是Java编程所必需的工具。3. 学习Java语法:掌握Java的基本语法,包括变量声...

从零开始,教你如何用Java生成微信小程序二维码
首先,选择适合的Java库,如zxing或qrcode,它们能提供所需的功能和易于使用的接口。然后,编写Java代码,创建一个类,该类应包含一个方法,接收小程序页面链接作为输入,调用库的API生成二维码。编写完代码后,进行测试和调试,确保生成的二维码准确无误。通过编写测试用例和使用调试工具,确保功能稳定可靠。

学好java要学哪些知识?
一、面向对象的知识:JAVA是一个面向对象的开发语言,因此熟悉面向对象对学习JAVA很有必要,您要了解:什么是对象,什么是类;什么是封装,什么是多态,什么是继承;什么是抽象类,什么是接口。了解了概念后,您还需要这些概念是如何体现的,如类和对象有什么区别?类是如何封装的? 二、JAVA语法:如果您有C++等面向对象语言的...

零基础如何学习java?
第二步:理论知识学习 这一过程尤为重要,毕竟这是学习Java的关键,而且,这一过程对于系统化的要求更高,如何循序渐进,有方式有目的的学习,将是小白更加快速的学懂Java的关键。所以给大家分享一个学习Java知识点的先后顺序安排,希望对大家有所帮助。1、Java 基础以及 Web 开发基础—小程序项目阶段,...

java学习的网站,谁可以推荐一个
1.java研究组织 (http:\/\/www.javaresearch.org\/index.jsp)。该网站有许多文章,涉及java的各个领域和方向。另为还有许多软件和书籍的下载,使一个java学习的不错的网站,有空去逛逛,会学到许多的东西。2.灰狐动力(http:\/\/www.huihoo.com\/)该站点有许多的开源的项目的介绍和学习,涉及操作系统...

0基础应该如何学习Java?
在java的学习中,最重要的表示实践,任何一个大牛都是敲出来的,光有理论知识,没有实际动手能力也是不行的。对java有兴趣的小伙伴们,不妨先从java入门开始!B站上有很多的java教学视频,从基础到高级的都有,还挺不错的,知识点讲的很细致,还有完整版的学习路线图。也可以自己去看看,下载学习试试...

小白自学JAVA怎么入门?
建议四:一定要有一个明白人去指导你,Java的专业程度很强,80%的问题自己很难解决,而且会很浪费时间,一个小问题可以困扰一天,这样自信心会受到严重的打击,如果没有人指导,可以 学习Java的四个阶段:一:Javase基础二:网页三剑客html+css+js三:JavaWeb和数据库:四:JavaEE框架:企业级开发,...

刚大学毕业学Java要学到一个什么程度?
大多数公司,对于Java初级开发的要求是,会用Spring Boot+JPA做增删改查。所以零基础的Java小白,无需学太多的内容,只要掌握Spring Boot+JPA做增删改查的技能。但是,Java小白如果要找到第一份工作,一定要写好简历同时准备好面试,否则学得再多也无法找到工作。千锋教育拥有线上免费Java线上公开课。

花山区13179147190: 急!问一个java的小问题
幸栏康妇: 纠正一下 读一个字节不可能返回流的大小 而是返回当前字节的int表示形式 因为byte和int是兼容的 可能因为byte类型很少用所以返回int 如果该函数返回-1说明已经读取到流的末尾即结束位置

花山区13179147190: java中的一个小问题! -
幸栏康妇: 很显然,这是找不到类报出的问题.可能原因如下:1.这个包没有下载到项目中,导致找不到.2.项目中有这个包,但是没有处于web-inf的lib目录,或者tomcat等容器的lib下.3.这个包,没有设置到classpath下.这个包在jsf-api.jar包中,可以从网上下载.希望能够帮到你吧.

花山区13179147190: 一个java小问题
幸栏康妇: final int sum = 7;//final是最终的不可修改的 那么你要想改变不sum = 8; 那么会出错的 static String name = "a";//static定义的都是静态变量 静态方法是无法调用非晶态变量的 //static final int MAX = 50; 就是静态的不可修改的一个常量

花山区13179147190: JAVA的一个小问题! -
幸栏康妇: 在实际工作中,常常需要设定数字的输出格式,如以百分比的形式输出,或者设定小数位数等,现稍微总结如下.主要使用的类:java.text.DecimalFormat1.实例化对象,可以用如下两种方法: DecimalFormat df=(DecimalFormat)...

花山区13179147190: 新人问一个关于Java的小问题 -
幸栏康妇: 进入DO-While循环后,执行“con=false;”, 若no不等于0,1,2,执行“con=true;”,while(con)中的con一直是true,循环执行. 当输入0或1或2后,执行对应的语句显示Menu, 执行后在执行下次循环时执行“con=false;”,这时由于no等于0,1,2中的一个不会执行“con=true;”,跳出循环.

花山区13179147190: 关于java编程的小问题
幸栏康妇: 首先 你得了解java中类是怎么使用的 库其实就是由一些现成的类,接口,异常组成.先不去看接口和异常,库中的类的使用方法和自定义的类的使用方法是一样的 比如你举例的String类中的 length()方法 它不是一个静态方法 所以你必须先实...

花山区13179147190: 求教一个JAVA小问题
幸栏康妇: 按照例子的要求是2-11的奇数.所以你需要输入一个2来进行计算,但是2肯定不是,所以不需要算,直接num1++,后面的num1++就不用解释了吧 \n是换行的意思 (num1%2 != 0) 是取模运算.你要取单数也就是奇数,一个数对2取模如果不等于0那他就是你要的那个数了 知道取模是啥意思吧?就是求余数

花山区13179147190: 关于JAVA的一个小问题 -
幸栏康妇: changer中的s和n确实改变了,但是并不是test()中的s和n改变,调用方法时传递的参数是值传递.

花山区13179147190: 三个超简单的java小问题 -
幸栏康妇: 你讲清楚点嘛! BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); int a=Integer.parseInt(br); print();至于数的位数和对其就要看你输出什么数调用别的方法来进行...

花山区13179147190: java小问题 -
幸栏康妇: System.out.print(); //只输出内容,不换行System.out.println(); //输出内容后进行换行举个例子:①:System.out.print('*');System.out.print('*');结果:**②:Syst...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网