i have a code which is always sorting in ascending order. i need to do it descending based on the input.
I have followed the previous post How to sort Wrapper list?'s code snippet). Here is my code,
public with sharing class OpenSalesOrderWrapper implements Comparable {
public Integer OrderNo;
public String PurchaseOrderNo;
public String SalesOrg;
public static String sortBy{get;set;}
//Constructor
public OpenSalesOrderWrapper(Integer OrdN, String PO, String SO) {
OrderNo = OrdN;
PurchaseOrderNo = PO;
SalesOrg = SO;
}
public Integer compareTo(Object compareTo)
{
System.debug('BBBBBBBBBBBBBBBB'+OrderNo);
OpenSalesOrderWrapper jobsWrapper = (OpenSalesOrderWrapper) compareTo;
if(sortBy == 'OrderNoAsc') {
if (OrderNo > jobsWrapper.OrderNo) {
return 1;
}
} else if(sortBy == 'OrderNoDesc') {
if(OrderNo < jobsWrapper.OrderNo) {
return -1;
}
}
return 0;
}
}
Class to test the above code:
public with sharing class ComparableTest {
public static void testSort() {
List<OpenSalesOrderWrapper> jobs = new List<OpenSalesOrderWrapper>();
jobs.add(new OpenSalesOrderWrapper(5,'E','T'));
jobs.add(new OpenSalesOrderWrapper(2,'F','Q'));
jobs.add(new OpenSalesOrderWrapper(1,'U','P'));
jobs.add(new OpenSalesOrderWrapper(4,'D','S'));
jobs.add(new OpenSalesOrderWrapper(3,'C','R'));
System.debug('Before sort:@@@@@@@@@@@'+jobs);
// Add things to the list ...
jobs.sort();
System.debug('After sort:>>>>>>>>>>>'+jobs);
}
}
when i executed as anonymous block by setting the value for static variable as given below,
OpenSalesOrderWrapper.sortby = 'OrderNoAsc';
ComparableTest.testsort();
gives me sorted results based on "OrderNo" 1,2,3,4,5 which is working as expected. But,
OpenSalesOrderWrapper.sortby = 'OrderNoDesc';
ComparableTest.testsort();
does not sort the list in either way. Simply output the same unsorted list. Am i doing anything wrong here? Please suggest.
Thanks, Baskaran
Attribution to: Bforce
Possible Suggestion/Solution #1
This should work: you just need to reverse the +1/-1 values to reverse the order:
public Integer compareTo(Object compareTo)
{
System.debug('BBBBBBBBBBBBBBBB'+OrderNo);
Boolean ascending = sortBy == 'OrderNoAsc';
OpenSalesOrderWrapper jobsWrapper = (OpenSalesOrderWrapper) compareTo;
if (OrderNo > jobsWrapper.OrderNo) {
return ascending ? 1 : -1;
} else if(OrderNo < jobsWrapper.OrderNo) {
return ascending ? -1 : 1;
} else {
return 0;
}
}
Attribution to: Keith C
Possible Suggestion/Solution #2
You are returning -1 and +1 if you toggle between > or <, but you are also toggling the > or < signs in the same case, meaning you will get the same result for ascending or descending.
Try changing it to:
public Integer compareTo(Object compareTo){
System.debug('BBBBBBBBBBBBBBBB'+OrderNo);
OpenSalesOrderWrapper jobsWrapper = (OpenSalesOrderWrapper) compareTo;
Integer result = (Order > jobsWrapper.OrderNo) ? 1 : (Order < jobsWrapper.OrderNo ? -1 : 0);
return sortBy == 'OrderNoAsc' ? result : result * -1;
return 0;
}
//Edit, looks like Keith and I have the same answer.
Attribution to: user321
This content is remixed from stackoverflow or stackexchange. Please visit https://salesforce.stackexchange.com/questions/32936