Salesforce技術ブログ:ApexでのsObjectソートとNULLの制御2

Salesforce技術ブログ:ApexでのsObjectソートとNULLの制御2

Salesforce技術ブログ:ApexでのsObjectソートとNULLの制御2

ドーモ、皆さん。ルルイエフクシゲです。
ぼちぼち年末の一大決戦が近づいてきて大忙しの今日この頃ですがいかがお過ごしでしょうか。

さて今回は前回記事
ApexでのsObjectソートとNULLの制御
の第2弾としてNULLの制御をもう少し深くやっていきたいと思います。

ソートをするうえで欠かせないのがこのNULLの制御、というわけで今回お見せするのはNULLS FIRSTとNULLS LASTの制御です。
早速コードの方をご覧いただきましょう。

降順&NULLS FIRSTの制御


public class SortController {
    public List targetAccList{get;set;}
    
    private Boolean isDesc;
    private Boolean isNullsLast;
    
    public SortController(){
        isDesc = true;
        isNullsLast= false;
        
        //取引先を取得
        List accList = new List();
        accList = [SELECT Id, Name, Sic, NumberOfEmployees FROM Account]; 
        //対象をソート
        targetAccList = new List();
        for(Account ac : accList){
            targetAccList.add(new AccDto(ac, isDesc, isNullsLast));
        }
        targetAccList.sort();
    }
    
    /**
     * ソート用クラス
     */
    public class AccDto implements Comparable{
        public Account acc{get;set;}
        private Integer sortFactor;
        private Integer nullSortFactor; 
        
        public AccDto(Account ac, Boolean isDesc,  Boolean isNullsLast){
            acc = ac;
            sortFactor = 1;
            nullSortFactor = 1;
            if(isDesc){
                sortFactor = -1;
            }
            if(isNullsLast){
                nullSortFactor = -1;
            }
        }
        
        public Integer compareTo(Object compareTo) {
            AccDto thisDto = (AccDto)compareTo;
            //nullを含む場合
            if(this.acc.NumberOfEmployees == null && thisDto.acc.NumberOfEmployees == null){
                if(this.acc.Sic != null && thisDto.acc.Sic == null){
                    return nullSortFactor;
                }
                if(this.acc.Sic == null && thisDto.acc.Sic != null){
                    return nullSortFactor * -1;
                }
                if(this.acc.Sic > thisDto.acc.Sic){
                    return sortFactor;
                }
                if(this.acc.Sic  thisDto.acc.Sic){
                    return sortFactor;
                }
                if(this.acc.Sic  thisDto.acc.NumberOfEmployees){
                return sortFactor;
            }
            return sortFactor*-1;
        }
    }
}

結果は以下の通り

無事降順でNULLが上に来るようにソートできました。

コードの内容としては基本的は前回と同じですが、NULLの制御を別フラグで管理しているのでNULLS FIRSTの制御が実現しています。
第2キー用のフラグを別に用意すれば第1キーはNULLS LAST、第2キーはNULLS FIRST、といった実装も当然可能となるわけです。

第2弾と銘打った割には何とも味気ない内容な気がしないでもないですが、
ルルイエフクシゲは初心者の発想アシスタントなのでこのレベルのことでも記事にする、いいね?

ということでまた何かあればまた記事に起こしたいと思います。
では、オタッシャデー!

简体中文English日本語한국어
翻訳