2018.12.14
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弾と銘打った割には何とも味気ない内容な気がしないでもないですが、 ルルイエフクシゲは初心者の発想アシスタントなのでこのレベルのことでも記事にする、いいね? ということでまた何かあればまた記事に起こしたいと思います。 では、オタッシャデー!