Java对象的排序查找及比较

在我们的编程过程中自然避免不了与排序打交道,而Java语言提供了排序算法的封装(包括数组排序和集合排序),对其底层实现感兴趣的同学可以查看其源代码(虽然Java内置了排序方法,学习排序方法还是很有必要的,正如我曾经看到的一个非十分恰当的比喻,如今已经有各种代步工具,但我们还是要从走路学起。何况众算法各有各的优势,多掌握一种算法就多了一种选择),除了排序之外本文还会讲到查找的知识(二分法查找),当然,此查找也是内置方法。至于比较则是本文的重点内容,其比较的定义决定了元素的排序方式。

Arrays类,数组的排序及查找

成员:
public static void sort(List list);
public static void sort(List list,Comparator c);
public static int binarySearch(List list,Object key);
public static int binarySearch(List list,Object key,Comparator c);
  • Arrays.asList(10,7,6,5,9)方法可以直接得到一个List对象
  • Arrays类提供了sort(),binarySearch()静态方法
  • 执行binarySearch()之前应调用sort()

例:
String[] s={.....};
Arrays.<String>sort(s);
Arrays.<String>binarySearch(s,x); //x为想要查找的元素


Collectsions类,集合的排序及查找

成员:
public static void sort(List list);   //Comparable接口
public static void sort(List list,Comparator c);   //Comparator接口
public static int binarySearch(List list,Object key);   //Comparable接口
public static int binarySearch(List list,Object key,Comparator c);//Comparator接口

此类完全由在Collections上进行操作静态方法组成

如sort,binarySearch,reverse等


关于比较

  • Comparable接口
1.什么是Comparable接口

此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,
类的 compareTo方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。 

2.实现什么方法

public int compareTo(Object o)
//比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。

·参数: o - 要比较的对象。 
·返回:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
·抛出:ClassCastException - 如果指定对象的类型不允许它与此对象进行比较。


  • Comparator接口
与上面的Comparable接口不同的是:

①、Comparator位于包java.util下,而Comparable位于包java.lang下。

②、Comparable接口将比较代码嵌入需要进行比较的类的自身代码中,而Comparator接口在一个独立的类中实现比较。(个人推荐使用Comparator接口,以保证对象与运行机制具有较低的耦合性 )

③、如果前期类的设计没有考虑到类的Compare问题而没有实现Comparable接口,后期可以通过Comparator接口来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序。


e.g.
  • 要么对象是java.lang.Comparable
实现方法
public int compareTo(Object obj){
return this.age-(Perosn)obj.age;
}
  • 要么提供一个java.lang.Comparator
实现方法 
public int compare(T o1,T o2){
return o1.age-o2.age;
}
这些方法的含义不要与equals冲突

List<Person> school = new ArrayList<>();
school.add( new Person("Li",23));
school.add( new Person("Wang",28));
school.add( new Person("Zhang",21));
school.add( new Person("Tang",19));
school.add( new Person("Chen",22));
school.add( new Person("Zhao",22)); //创建list


(1)Collections.sort( school, new PersonComparator() ); //Comparator排序
(2)Collections.sort(school);                 //Comparable排序
(3)school.stream().sorted(new PersonComparator()).forEach(System.out::println);//流式操作(Comparator排序)
(4)school.stream().sorted().forEach(System.out::println); //流式操作(Comparable排序)

//可以使用系统已有的排序及查找:Arrays类,Collections类,也可以用流式操作的sorted()进行排序

更一般的,在JDK8以上我们更倾向于使用Lambda表达式

e.g.
Collections.sort(school,(p1,p2)->p1.age-p2.age );

/***************************分割线****************************/


//实现Comparable的Perosn类
class Person implements Comparable<Person>{

String name;
int age;

Person(String name,int age){
this.name=name;
this.age=age;
}

//记得Override其toString方法
public String toString(){
return name+":"+age;
}

public int compareTo(Person p) {
return this.age-p.age;
}

}

//一个比较器
class PersonComparator implements Comparator<Object>
{
public int compare( Object obj1, Object obj2 ){
Person p1 = (Person)obj1;
Person p2 = (Person)obj2;
if( p1.age > p2.age ) return 1;
else if(p1.age<p2.age) return -1;
return p1.name.compareTo( p2.name );
}
}

Comments

Popular posts from this blog

抓包工具Wireshark下载及安装教程

HTTP协议特性

Java中Synchronized的用法