java comparable是什么 java的comparable接口什么意思
大家好,如果您还对java comparable是什么不太了解,没有关系,今天就由本站为大家分享java comparable是什么的知识,包括java的comparable接口什么意思的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
...实现Comparator接口 //与Comparable 的区别
comparator接口与Comparable接口的区别
1. Comparator和 Comparable相同的地方
他们都是java的一个接口,并且是用来对自定义的class比较大小的,
什么是自定义class:如 public class Person{ String name; int age}.
当我们有这么一个personList,里面包含了person1, person2, persion3.....,我们用Collections.sort( personList),是得不到预期的结果的.这时肯定有人要问,那为什么可以排序一个字符串list呢:
如 StringList{"hello1","hello3","hello2"}, Collections.sort( stringList)能够得到正确的排序,那是因为 String这个对象已经帮我们实现了 Comparable接口,所以我们的 Person如果想排序,也要实现一个比较器。
2. Comparator和 Comparable的区别
Comparable
Comparable定义在 Person类的内部:
public class Persion implements Comparable{..比较Person的大小..},
因为已经实现了比较器,那么我们的Person现在是一个可以比较大小的对象了,它的比较功能和String完全一样,可以随时随地的拿来比较大小,因为Person现在自身就是有大小之分的。Collections.sort(personList)可以得到正确的结果。
Comparator
Comparator是定义在Person的外部的,此时我们的Person类的结构不需要有任何变化,如
public class Person{ String name; int age},
然后我们另外定义一个比较器:
public PersonComparator implements Comparator(){..比较Person的大小..},
在PersonComparator里面实现了怎么比较两个Person的大小.所以,用这种方法,当我们要对一个 personList进行排序的时候,我们除了了要传递personList过去,还需要把PersonComparator传递过去,因为怎么比较Person的大小是在PersonComparator里面实现的,如:
Collections.sort( personList, new PersonComparator()).
3. Comparator和 Comparable的实例
Comparable:
实现Comparable接口要覆盖compareTo方法,在compareTo方法里面实现比较:
public class Person implements Comparable{
String name;
int age
public int compareTo(Person another){
int i= 0;
i= name.compareTo(another.name);//使用字符串的比较
if(i== 0){//如果名字一样,比较年龄,返回比较年龄结果
return age- another.age;
} else{
return i;//名字不一样,返回比较名字的结果.
}
}
}
这时我们可以直接用 Collections.sort( personList)对其排序了.
Comparator:
实现Comparator需要覆盖 compare方法:
public class Person{
String name;
int age
}
class PersonComparator implements Comparator{
public int compare(Person one, Person another){
int i= 0;
i= one.name.compareTo(another.name);//使用字符串的比较
if(i== 0){//如果名字一样,比较年龄,返回比较年龄结果
return one.age- another.age;
} else{
return i;//名字不一样,返回比较名字的结果.
}
}
}
Collections.sort( personList, new PersonComparator())可以对其排序
4:总结
两种方法各有优劣,用Comparable简单,只要实现Comparable接口的对象直接就成为一个可以比较的对象,但是需要修改源代码,用Comparator的好处是不需要修改源代码,而是另外实现一个比较器,当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了,并且在Comparator里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。
java 中compare 是什么
public int compareTo(Double anotherDouble)从数字上比较两个 Double对象。在应用到基本 double值时,通过此方法进行的比较与通过 Java语言的数值比较运算符(<、<=、==和>=>)进行的比较之间存在以下两方面的不同:
此方法认为 Double.NaN等于它自身,且大于其他所有 double值(包括 Double.POSITIVE_INFINITY)。
此方法认为 0.0d大于-0.0d。
这可以确保受此方法影响的 Double对象的自然顺序与 equals方法一致。
指定者:
接口 Comparable<Double>中的 compareTo
参数:
anotherDouble-要比较的 Double值。
返回:
如果 anotherDouble在数字上等同于此 Double,则返回 0;如果 Double在数字上小于此 anotherDouble,则返回小于 0的值;如果 Double在数字上大于此 anotherDouble,则返回大于 0的值。
打字不易,如满意,望采纳。
java的comparable接口什么意思
1.什么是Comparable接口
此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序,类的 compareTo方法被称为它的自然比较方法。实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。强烈推荐(虽然不是必需的)使自然排序与 equals一致。所谓与equals一致是指对于类 C的每一个 e1和 e2来说,当且仅当(e1.compareTo((Object)e2)== 0)与e1.equals((Object)e2)具有相同的布尔值时,类 C的自然排序才叫做与 equals一致。
2.实现什么方法
int compareTo(T o)
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
强烈推荐(x.compareTo(y)==0)==(x.equals(y))这种做法,但不是严格要求这样做。一般来说,任何实现 Comparable接口和违背此条件的类都应该清楚地指出这一事实。推荐如此阐述:“注意:此类具有与 equals不一致的自然排序。”
参数:
o-要比较的对象。
返回:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
抛出:
ClassCastException-如果指定对象的类型不允许它与此对象进行比较。
3.实例
import java.util.*;
public class EmployeeSortTest{
/**
*@param args
*/
public static void main(String[] args){
// TODO Auto-generated method stub
Employee[] staff= new Employee[ 3 ];
staff[ 0 ]= new Employee("harry Hacker", 35000);
staff[ 1 ]= new Employee("carl cracke", 75000);
staff[ 2 ]= new Employee("tony Tester", 38000);
Arrays.sort(staff);//sort方法可以实现对对象数组排序,但是必须实现 Comparable接口
/*Comparable接口原型为:
* public interface Comparable<T>
*{
* int compareTo(T other);//接口的中方法自动属于public方法
*}
*/
for(Employee e: staff)
System.out.println("id="+e.getId()+" name="+e.getName()+
".salary="+e.getSalary());
}
}
/*
*因为要实现对Employee对象的排序,所以在Employee类中要实现Comparable接口,
*也就是要实现comepareTo()方法
*/
class Employee implements Comparable<Employee>
{
public Employee(String n, double s)
{
name= n;
salary= s;
Random ID= new Random();
id= ID.nextInt( 10000000);
}
public int getId()
{
return id;
}
public String getName()
{
return name;
}
public double getSalary()
{
return salary;
}
public void raiseSalary( double byPercent)
{
double raise= salary*byPercent/ 100;
salary+=raise;
}
public int compareTo(Employee other)
{
if(id<other.id)//这里比较的是什么 sort方法实现的就是按照此比较的东西从小到大排列
return- 1;
if(id>other.id)
return 1;
return 0;
}
private int id;
private String name;
private double salary;
}
4.与Comparator的区别
Comparator位于包java.util下,而Comparable位于包java.lang下,Comparable接口将比较代码嵌入自身类中,而后者在一个独立的类中实现比较。如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过 Comparator来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序。
我们看一个Comparator的例子:
import java.util.TreeSet;
import java.util.Comparator;
class NumComparator implements Comparator<NameTag>{
public int compare(NameTag left,NameTag right){
return(left.getNumber()- right.getNumber());
}
}
public class CollectionNine{
public static void main(String arg[]){
new CollectionNine();
}
CollectionNine(){
NumComparator comparator= new NumComparator();
TreeSet<NameTag> set= new TreeSet<NameTag>(comparator);
set.add(new NameTag("Agamemnon",300));
set.add(new NameTag("Cato",400));
set.add(new NameTag("Plato",100));
set.add(new NameTag("Zeno",200));
set.add(new NameTag("Archimedes",500));
for(NameTag tag: set)
System.out.println(tag);
}
}
看不明白欢迎再来询问
Java, Comparable作为参数类型
这个子类能出现的地方,父类就能出现;这里并不是一个真正的接口对象,因为接口是不能实例化的,但是这里可以写他的任何一个子类,父类引用指向子类;
也不是你所说的船任意类进去都行,在第一个参数中只能传递一个实现comparable接口的类的对象,第二个参数应该是可以传递任意可实例化对象,因为Object是任意类的父类
好了,文章到此结束,希望可以帮助到大家。