1. 程式人生 > >比較器Comparator的試用

比較器Comparator的試用

     近段時間有空就在熟悉Java,所以也常常在CSDN上看看相關的帖子。那天有人問如何利用Arrays的sort方法實現對int陣列的逆序排列,自然可以直接寫這麼一個逆序排列函式,不過由於Arrays的sort還可以利用比較器Comparator比較精確地控制排序,所以也試著用比較器做了一下,程式如下:
import java.util.*;
publicclass test {
    
publicstaticvoid main(String[] arg) throws Exception{
        Integer a[]
={21,31,1,9,5,10};//原始陣列
        ComDown c=new ComDown();//定義比較器例項
        Arrays.sort(a,c);//利用比較器控制排序
for(int i=0; i<a.length;i++) System.out.print(a[i]+"");//輸出
    }

}

//派生Comparator介面的Integer型別類

class ComDown implements Comparator<Integer>{
    
publicint compare(Integer i1, Integer i2) {//實現compare方法
if(i1>i2) return-1;//控制逆序排列
elseif(i1<i2) return1;
        
elsereturn0;
    }
    
}
    從使用來看,比較器介面的應用可以構造一個通用的排序控制方法。上述程式碼就實現了對於Integer型別陣列的逆序排列。不過遺憾的是,由於Java中的泛型只能對物件操作,對於int一類的簡單型別不能象C++的模版一樣使用,所以對簡單型別的操作似乎反而不如直接寫排序方法簡單直接。不過比較器特別對於一些常規意義上不能排序的物件能夠實現排序,也能夠方便地進行重用,這是它的優點。如下例,就對自定義的一個Person類構造了依據姓名和年齡的兩個比較器,從而方便地實現了不能直接排序的Person物件的排序。
import java.util.*;
publicclass test ...{
    
publicstaticvoid main(String[] arg) throws Exception...{
        Person a[]
=new Person[2];
        a[
0]=new Person("ZhangSan",28);
        a[
1]=new Person("LiSi",19);
        ComName cn
=new ComName();
        ComAge ca
=new ComAge();
        Arrays.sort(a,cn);
        
for(int i=0; i<a.length;i++) a[i].print();
        Arrays.sort(a,ca);
        
for(int i=0; i<a.length;i++) a[i].print();
    }

}

class Person ...{
    
public String name;
    
publicint age;
    Person(String n, 
int a) ...{
        name
=n;
        age
=a;
    }

    
publicvoid print() ...{
        System.out.println(
"Name is "+name+", Age is "+age);
    }

}

class ComName implements Comparator<Person>...{
    
publicint compare(Person p1, Person p2) ...{
        
return p1.name.compareTo(p2.name);
    }
    
}

class ComAge implements Comparator<Person>...{
    
publicint compare(Person p1, Person p2) ...{
        
if(p1.age>p2.age) return-1;
        
elseif(p1.age<p2.age) return1;
        
elsereturn0;
    }

}
下面則是利用字串中數字所標示的位置來控制int陣列中比較元素的二維陣列排序比較器:
import java.util.*;
publicclass test {
    
publicstaticvoid main(String[] arg)throws Exception {
        
int ary[][]={{2,5,1,0,6},{6,9,4,8,5},{3,6,4,7,5},{2,3,1,5,7}};
        sort2 s
=new sort2("0213");
        Arrays.sort(ary,s);Arrays.sort(ary,s);
        
for(int[] a:ary) {
            
for(int i:a) System.out.print(i+"");
            System.out.println();
        }

    }

}

class sort2 implements Comparator<int[]>{
    
private String ss;//控制比較位置的字串
privateint ind=0;//控制字串索引
public sort2(String s){ss=s+"0";}
    
publicint compare(int a[], int b[]) {
        
int r;
        
if(a[Integer.parseInt(ss.substring(ind,ind+1))]>b[Integer.parseInt(ss.substring(ind,ind+1))])
            r
=1;
        
elseif(a[Integer.parseInt(ss.substring(ind,ind+1))]<b[Integer.parseInt(ss.substring(ind,ind+1))])
            r
=-1;
        
else r=0;
        ind
++;
        
if(ind>=ss.length()) ind=0//如果比較完成,初始化ind為0
return r;
    }

}

相關推薦

比較Comparator試用

     近段時間有空就在熟悉Java,所以也常常在CSDN上看看相關的帖子。那天有人問如何利用Arrays的sort方法實現對int陣列的逆序排列,自然可以直接寫這麼一個逆序排列函式,不過由於Arrays的sort還可

類的可比較性Comparable和比較Comparator

string fault nts font nal 返回值 extends 方式 ret 1. Comparable Comparable源碼如下: public interface Comparable<T> { public int compareT

比較Comparator的底層結構淺談

      查API可知,介面 Comparator<T>存在於java.util包中,可以知道此介面所處的包是非常實用,我們的比較器見名知意,肯定是用於比較的,在Java1.6的API中有這麼一句話:public interface Comparator<

Java Map集合利用比較Comparator根據Key和Value的排序

TreeMap排序 根據Key進行排序 Map的根據key排序需要用到TreeMap物件,因為它是預設按照升序進行輸出的,可以使用比較器compareTo對它進行降序排序,Comparator可以對集合物件或者陣列進行排序的比較器介面,實現該介面的public compa

【Java學習筆記】45:優先順序佇列PriorityQueue和比較Comparator

模擬程序排程時的優先數法和簡單時間片輪轉法,前者可以為程序設定以優先數PRIORITY為優先順序,為了更好地併發,每次獲得處理機後優先數減少3而重新選取。 在簡單輪轉法中則僅僅是一個普通佇列,按照FIFO的方式出隊獲得處理機。 如果要使用比較器Compara

比較Comparator

Comparator介面 java中有內建的排序,Arrays.sort(),現在我有一個Student類,類中三個成員變數name,id,age,我現在想以age作為參考進行升序排序,應該如何做,很簡單,只需要自己定義一個類實現Comparator介面即可 i

比較comparator,compare函式升序、降序原始碼分析

0、前言   一直想不明白,compare函式如何通過返回值,就確定是升序還是降序呢,於是乎決定好好的先看看原始碼。   下面的程式碼實現了對自己寫的Students類按照年齡升序的排序,就是通過對實現comparator介面,重寫compare的方法,實現

比較Comparator 和 Comparable的簡單區別

    1,簡介    最近在刷題的時候需要用到對自定義的類進行排序,於是想到了實現比較器介面,發現有comparator和conparable兩個比較器介面,具體分析一下兩者的區別。    例如現在

java-集合類(3)-實現比較(Comparator)介面-LinkedList針對插入刪除、開始處增加元素

實現比較器(Comparator)介面 實現比較器例子: package ArrayList; import java.util.ArrayList; import java.util.Arrays; import java.util.Collec

Java 物件比較 comparator 的作用及用法

排序的演算法是我們最常用的演算法,初學程式,每個人都嘗試過排序。但只是侷限於簡單的排序。 如將下列數字進行排序 1,3,5,8,3,6 於是我們得出結果 1,3,3,5,6,8 將下列字母(字元)進行排序 a,i,e,f,w,s 於是我們得出結果 a,e,f,i,s,w 但

另一種比較Comparator

span 問題 com pre log implement nts face spa package comparatordemo.cn; import java.util.Comparator; /* * 一個對象的初期,並沒有實現comparable 接口,此時

常用的比較:實現方式Compareable和Comparator

err 方式 pareto rri 編寫 sta urn getname rabl class Dog{ int size; int weight; public Dog(int s, int w){ siz

Java的Comparable內部比較Comparator外部比較

正整數 seq pareto private 實現 結果 pack 單獨 post //這裏簡單介紹一下Java的Comparable內部比較器和Comparator外部比較器的用法實現 //那麽我們來做一個關於對象間的排序,首先建一個Model或者叫JavaBen。如下:

java.util下有一個Comparator(比較)

ack list clas 必須 har ble sort rabl short java.util下有一個Comparator(比較器) 它擁有compare(),用來比較兩個方法。 要生成比較器,則用Sort中Sort(List,List(Compate)) 第二種方法

Java8 List去掉重複物件——contains方法、Comparator比較

一、去除List中重複的String public List<String> removeStringListDupli(List<String> stringList) { Set<String> set = new LinkedHashSet<

java學習筆記13--比較 Comparable Comparator

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Java中常用的比較Comparable與Comparator

在公司實習了一段時間發現自己有些基礎知識理解的不是很清楚,今天把比較器的部分簡單總結一下! 有不對的歡迎指正! 需要為多個物件排序時必須設定規定的排序規則,排序規則可以通過比較器進行設定。Java提供兩種比較常用的比較器:Comparable和Compara

java comparator 排序 定義比較內部類的方式排序 通用排序方式 非常靈活

class Products implements Comparable<Products>  {private String name;private int num;private Integer price;public String getName()

Comparator比較的使用,Map排序

專案開發過程中,總會遇到各種沒有遇見過的需求,今天遇到了一個map排序問題。 Map<String,Object> testMap = new HashMap<String,Object>(); KEY 值的規則是這樣的: xx

Java Comparable排序介面和Comparator比較介面

       實現Comparable介面的類支援排序,假設現在存在“實現Comparable介面的類的物件的List列表(或陣列)”,則該List列表(或陣列)可以通過 Collections.so