2 sckgeneral sckgeneral 于 2016.04.01 15:08 提问

Java TreeSet定制排序

各位牛人,大家好!

  我在练习TreeSet定制排序的时候。我发现在TreeSet构造函数里面定义一个Comparator的匿名内部类的实例,这个实例只需要实现compare这个方法就能运行。但是我看Comparator这个借口里面有两个方法,除了上面的那个还有一个equals。我比较好奇,内部类不需要实现接口的所有方法嘛?谢谢。下面是我的代码。

import java.util.*;
class R
{
int count;
public R(int count)
{
this.count=count;
}
public String toString(){
return "R的count的值:"+this.count;
}
public boolean equals(Object O)
{
if(O == null)
{
System.out.println("不能为空");
return false;
}
if(O instanceof R)
{
if(((R)O).count==this.count)
{
System.out.println("值相等");
return true;
}
else
{
System.out.println("值不相等");
return false;
}
}
else
{
System.out.println("类型不对");
return false;
}
}
}
public class TestTreeSet4
{
public static void main(String[] args){
TreeSet ts1 = new TreeSet(new Comparator(){
public int compare(Object O1,Object O2){
R R1=(R)O1;
R R2=(R)O2;
if(R1.count>R2.count){
return -1;
}
else if(R1.count==R2.count){
return 0;
}
else{
return 1;
}
}
});
ts1.add(new R(-2));
ts1.add(new R(-10));
ts1.add(new R(4));
System.out.println(ts1);
}
}

2个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.04.01 15:15
已采纳

你的代码没有问题,如果需要排序的话实现的就是Comparator接口或者Comparable接口。
那个equals方法是Object类的,你只是重写了equals方法,用来判断两个对象是否相等时可以调用equals方法,不是比较大小,而是纯粹比较是否相同。
compareTo方法才是排序比较调用的方法,这个才是比较大小用的。

sckgeneral
sckgeneral 回复毕小宝: 看来我之前对接口实现有问题。以为接口方法的实现只能在本类中实现。
2 年多之前 回复
sckgeneral
sckgeneral 回复毕小宝: 感谢您的回复,我按照您说的试了一下,的确是这样。
2 年多之前 回复
wojiushiwo945you
wojiushiwo945you 回复sckgeneral: 因为equals方法Object类已经有了,所以实现Comparator接口的方法只需要实现compare方法就可以了。就是这样的,你可以新建一个类实现Comparator接口,Eclipse会提示你只需要实现compare方法的。
2 年多之前 回复
wojiushiwo945you
wojiushiwo945you 回复sckgeneral: 你实现的是Comparator的一个内部类,它就是只有一个compare方法的嘛。语法是正确的。否则就报编译错误了哦。
2 年多之前 回复
sckgeneral
sckgeneral 谢谢您的回复。匿名内部类在实现的时候只实现compare这个方法就可以嘛?总感觉语法上不合规啊。
2 年多之前 回复
sckgeneral
sckgeneral 谢谢您的回复。匿名内部类在实现的时候只实现compare这个方法就可以嘛?总感觉语法上不合规啊。
2 年多之前 回复
CSDNXIAOC
CSDNXIAOC   2016.04.01 15:13

package collection;

import java.util.Comparator;
import java.util.TreeSet;

import org.junit.Test;

/*

  • TreeSet的定制排序 */

public class TestTreeSet02 {
// 主方法
public static void main(String[] args......
答案就在这里:【java】TreeSet的定制排序
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
集合TreeSet(自然排序与定制排序)
一、TreeSet的自然排序: 步骤:让元素自身具备比较性, 实现Compareable接口,覆盖其CompareTo方法   class Student implements Comparable//第一:实现Compareable接口 {     private String name;     private int age;       Student(Strin
【java】TreeSet的定制排序
package collection; import java.util.Comparator; import java.util.TreeSet; import org.junit.Test; /* * TreeSet的定制排序 */ public class TestTreeSet02 { // 主方法 public static void main(String[] args
TreeSet的两种排序方式:自然排序和定制排序
TreeSet的两种排序方式:自然排序和定制排序 TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。TreeSet有两种排序方法:自然排序和定制排序。默认采用自然排序。 1. 自然排序 要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object obj)的抽象方法在此方法中,指明按照自定义类的哪个属性进行排序
TreeSet的自然排序和定制排序
只要放在TreeSet中的元素对象,在该对象的类中必须实现Comparable接口,必须覆盖该接口中的compareTo()方法,并在该方法中编写比较规则。(该方法不能自动生成)自然排序(Comparable) TreeSet拥有的集合元素的compareTo()方法来比较元素的大小关系,然后将集合元素按照升序排列。 int compareTo(T o) 将此对象与指定的对象进行比较,以返
TreeSet之定制排序和自然排序
TreeSet的几大特点: 1、TreeSet中存储的类型必须是一致的,不能一下存int,一下又存string 2、TreeSet在遍历集合元素时,是有顺序的【从小到大】(我的理解,如果存的字母,按字典序排列) 3、排序:当向TreeSet中添加自定义对象时,有2种排序方法,1:自然排序 2、定制排序 自然排序:要求自定义类实现java.lang.Comparable接口并重写co...
TreeSet的排序两种实现方式Comparator和Comparable
TreeSet 条件 类型一样 设计到排序 comparable是自然(可以修改类的情况下) comparator是定制(不可以修改类的情况下)优先级更高  使用说明: 一般采用的是自然排序,但是当,不能对类进行修改时不得不采用comparator方法,下面的demo采用了两种方式结合。 代码整体说明: Employee类的birthday属性是自定义类MyDate类型
实现TreeSet定制排序两种方式
http://www.toutiao.com/a6347848405252309249/?tt_from=mobile_qq&utm_campaign=client_share&app=explore_article&utm_source=mobile_qq&iid=5840657922&utm_medium=toutiao_ios
TreeSet保证元素唯一并实现排序的原理
TreeSet:根据构造方法的不用,选择使用自然排序或者比较器排序。 按照实际的需求,可以对元素进行排序。并且保证唯一。 怎么保证的呢? 排序:底层结构是二叉树。按照树节点进行存储和取出。 两种实现: A:自然排序(元素具备比较性) TreeSet的无参构造,要求对象所属的类实现Comparable接口。 B:比较器
Java容器Treeset的两种排序方法
TreeSet支持两种排序方式:自然排序、定制排序 1、自然排序:自然排序下,集合元素必须是实现了Comparable接口的类的对象。 也就是说,在这种排序方式下需要实现Comparable接口。 覆盖此接口中的compareTo(Object obj)方法,定义目标的比较方法package edu.hnsd1.dao; import java.
Java:TreeSet定制排序后无法被对象输出流写入到文件
今天,遇到了一个问题,一个TreeSet集合,存着Student类,要求按照年龄升序排序,那自然就要用到自然排序或定制排序了。因为喜欢用定制排序,匿名内部类实现Comparator接口就行了,挺好用。 结果,用出事了……在使用对象输出流将TreeSet集合对象写入到文件中时,却抛出了异常 目前还不知道具体是原因,只知道是匿名内部类出了问题,估计是没有serilaizable标志吧。 解决方法就