国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Comparator用法總結(jié) - ★yesjoy★ - BlogJava
比較函數(shù)
TreeSet和TreeMap都按排序順序存儲(chǔ)元素。然而,精確定義采用何種“排序順序”的是比較函數(shù)。通常在默認(rèn)的情況下,這些類通過(guò)使用被Java稱之為“自然順序”的順序存儲(chǔ)它們的元素,而這種順序通常也是你所需要的(A在B的前面,1在2的前面,等等)。如果需要用不同的方法對(duì)元素進(jìn)行排序,可以在構(gòu)造集合或映射時(shí),指定一個(gè)Comparator對(duì)象。這樣做為你提供了一種精確控制如何將元素儲(chǔ)存到排序類集和映射中的能力。
  
  Comparator接口定義了兩個(gè)方法:compare( )和equals( )。這里給出的compare( )方法按順序比較了兩個(gè)元素:
  
  int compare(Object obj1, Object obj2)
  
  obj1和obj2是被比較的兩個(gè)對(duì)象。當(dāng)兩個(gè)對(duì)象相等時(shí),該方法返回0;當(dāng)obj1大于obj2時(shí),返回一個(gè)正值;否則,返回一個(gè)負(fù)值。如果用于比較的對(duì)象的類型不兼容的話,該方法引發(fā)一個(gè)ClassCastException異常。通過(guò)覆蓋compare( ),可以改變對(duì)象排序的方式。例如,通過(guò)創(chuàng)建一個(gè)顛倒比較輸出的比較函數(shù),可以實(shí)現(xiàn)按逆向排序。
  
  這里給出的equals( )方法,測(cè)試一個(gè)對(duì)象是否與調(diào)用比較函數(shù)相等:
  
  boolean equals(Object obj)
  
  obj是被用來(lái)進(jìn)行相等測(cè)試的對(duì)象。如果obj和調(diào)用對(duì)象都是Comparator的對(duì)象并且使用相同的排序。該方法返回true.否則返回false.重載equals( )方法是沒(méi)有必要的,大多數(shù)簡(jiǎn)單的比較函數(shù)都不這樣做。
  
  1 使用比較函數(shù)
  
  下面是一個(gè)說(shuō)明定制的比較函數(shù)能力的例子。該例子實(shí)現(xiàn)compare( )方法以便它按正常順序的逆向進(jìn)行操作。因此,它使得一個(gè)樹(shù)集合按逆向的順序進(jìn)行存儲(chǔ)。
// Use a custom comparator.
import java.util.Comparator;
//A reverse comparator for strings.
public class MyComp implements Comparator {
    
public int compare(Object a, Object b) {
        String aStr, bStr;
        aStr 
= (String) a;
        bStr 
= (String) b;
        
// reverse the comparison
        return bStr.compareTo(aStr);
    }

    
// no need to override equals
}

import java.util.Iterator;
import java.util.TreeSet;

public class CompDemo {
    
public static void main(String[] args) {
        
// Create a tree set
        TreeSet ts = new TreeSet(new MyComp());
        
// Add elements to the tree set
        ts.add("C");
        ts.add(
"A");
        ts.add(
"B");
        ts.add(
"E");
        ts.add(
"F");
        ts.add(
"D");
        
// Get an iterator
        Iterator i = ts.iterator();
        
// Display elements
        while (i.hasNext()) {
            Object element 
= i.next();
            System.out.print(element 
+ " ");
        }

        System.out.println();
    }

}


正如下面的輸出所示,樹(shù)按照逆向順序進(jìn)行存儲(chǔ):
  
  F E D C B A
  
  仔細(xì)觀察實(shí)現(xiàn)Comparator并覆蓋compare( )方法的MyComp類(正如前面所解釋的那樣,覆蓋equals( )方法既不是必須的,也不是常用的)。在compare( )方法內(nèi)部,String方法compareTo( )比較兩個(gè)字符串。然而由bStr??不是aStr??調(diào)用compareTo( )方法,這導(dǎo)致比較的結(jié)果被逆向。
  
  對(duì)應(yīng)一個(gè)更實(shí)際的例子,下面的例子是用TreeMap程序?qū)崿F(xiàn)前面介紹的存儲(chǔ)賬目資產(chǎn)平衡表例子的程序。在前面介紹的程序中,賬目是按名進(jìn)行排序的,但程序是以按照名字進(jìn)行排序開(kāi)始的。下面的程序按姓對(duì)賬目進(jìn)行排序。為了實(shí)現(xiàn)這種功能,程序使用了比較函數(shù)來(lái)比較每一個(gè)賬目下姓的排序。得到的映射是按姓進(jìn)行排序的。
//Use a comparator to sort accounts by last name.
import java.util.Comparator;

//Compare last whole words in two strings.
public class TComp implements Comparator {

    
public int compare(Object a, Object b) {
        
int i, j, k;
        String aStr, bStr;
        aStr 
= (String) a;
        bStr 
= (String) b;
        
// find index of beginning of last name
        i = aStr.lastIndexOf( );
        j 
= bStr.lastIndexOf( );
        k 
= aStr.substring(i).compareTo(bStr.substring(j));
        
if (k == 0// last names match, check entire name
            return aStr.compareTo(bStr);
        
else
            
return k;
    }

    
// no need to override equals
}

import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapDemo2 {
    
public static void main(String[] args) {
        
// Create a tree map
        TreeMap tm = new TreeMap(new TComp());
        
// Put elements to the map
        tm.put("John Doe"new Double(3434.34));
        tm.put(
"Tom Smith"new Double(123.22));
        tm.put(
"Jane Baker"new Double(1378.00));
        tm.put(
"Todd Hall"new Double(99.22));
        tm.put(
"Ralph Smith"new Double(-19.08));
        
// Get a set of the entries
        Set set = tm.entrySet();
        
// Get an iterator
        Iterator itr = set.iterator();
        
// Display elements
        while (itr.hasNext()) {
            Map.Entry me 
= (Map.Entry) itr.next();
            System.out.print(me.getKey() 
+ "");
            System.out.println(me.getValue());
        }

        System.out.println();
        
// Deposit 1000 into John Doe‘s account
        double balance = ((Double) tm.get("John Doe")).doubleValue();
        tm.put(
"John Doe"new Double(balance + 1000));
        System.out.println(
"John Doe‘s new balance: " + tm.get("John Doe"));
    }

}


  這里是程序的輸出結(jié)果,注意此時(shí)的賬目是按姓進(jìn)行排序的:
  
  Jane Baker: 1378.0
  
  John Doe: 3434.34
  
  Todd Hall: 99.22
  
  Ralph Smith: -19.08
  
  Tom Smith: 123.22
  
  John Doe’s new balance: 4434.34
  
  比較函數(shù)類TComp比較兩個(gè)包含姓和名的字符串。它首先比較姓。具體是這樣做的,它首先尋找每一個(gè)字符串中最后一個(gè)空格的下標(biāo),然后比較從這個(gè)位置開(kāi)始的每一個(gè)元素的子字符串。當(dāng)兩個(gè)字符串中姓完全相等時(shí),它再比較兩個(gè)名。這樣就形成了一個(gè)先按姓進(jìn)行排序,在姓相同的情況下,再按名字進(jìn)行排序的樹(shù)型映射。通過(guò)程序的輸出中RalphSmith出現(xiàn)在Tom Smith之前的結(jié)果可以看到這一點(diǎn)。

參照:http://www.linuxmine.com/43849.html
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
JAVA版微信支付V3-完全版
java.lang.Comparable接口
treemap 使用
C#DllImport的用法
java 遍歷map 方法
GoF設(shè)計(jì)模式之二十一 Strategy- -
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服