Created
May 24, 2011 21:38
-
-
Save fractastical/989792 to your computer and use it in GitHub Desktop.
Apex-Lang List Functions (Merge, etc.)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* ============================================================ | |
* This code is part of the "apex-lang" open source project avaiable at: | |
* | |
* http://code.google.com/p/apex-lang/ | |
* | |
* This code is licensed under the Apache License, Version 2.0. You may obtain a | |
* copy of the License at: | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* ============================================================ | |
*/ | |
global class ArrayUtils { | |
global static String[] EMPTY_STRING_ARRAY = new String[]{}; | |
global static Integer MAX_NUMBER_OF_ELEMENTS_IN_LIST {get{return 1000;}} | |
global static Object[] reverse(Object[] anArray) { | |
if (anArray == null) { | |
return null; | |
} | |
Integer i = 0; | |
Integer j = anArray.size() - 1; | |
Object tmp; | |
while (j > i) { | |
tmp = anArray[j]; | |
anArray[j] = anArray[i]; | |
anArray[i] = tmp; | |
j--; | |
i++; | |
} | |
return anArray; | |
} | |
global static SObject[] reverse(SObject[] anArray) { | |
if (anArray == null) { | |
return null; | |
} | |
Integer i = 0; | |
Integer j = anArray.size() - 1; | |
SObject tmp; | |
while (j > i) { | |
tmp = anArray[j]; | |
anArray[j] = anArray[i]; | |
anArray[i] = tmp; | |
j--; | |
i++; | |
} | |
return anArray; | |
} | |
global static Object[] mergex(Object[] array1, Object[] array2){ | |
if(array1 == null){ return array2; } | |
if(array2 == null){ return array1; } | |
Object[] merged = new Object[array1.size() + array2.size()]; | |
for(Integer i = 0; i < array1.size(); i++){ | |
merged[i] = array1[i]; | |
} | |
for(Integer i = 0; i < array2.size(); i++){ | |
merged[i+array1.size()] = array2[i]; | |
} | |
return merged; | |
} | |
global static SObject[] mergex(SObject[] array1, SObject[] array2){ | |
if(array1 == null){ return array2; } | |
if(array2 == null){ return array1; } | |
if(array1.size() <= 0){ return array2; } | |
List<SObject> merged = createEmptySObjectList(array1[0]); | |
for(SObject sObj : array1){ merged.add(sObj); } | |
for(SObject sObj : array2){ merged.add(sObj); } | |
return merged; | |
} | |
global static Boolean isEmpty(Object[] objectArray){ | |
if(objectArray == null){ | |
return true; | |
} | |
return objectArray.size() == 0; | |
} | |
global static Boolean isEmpty(SObject[] objectArray){ | |
if(objectArray == null){ | |
return true; | |
} | |
return objectArray.size() == 0; | |
} | |
global static Boolean isNotEmpty(Object[] objectArray){ | |
return !isEmpty(objectArray); | |
} | |
global static Boolean isNotEmpty(SObject[] objectArray){ | |
return !isEmpty(objectArray); | |
} | |
global static Object[] pluck(SObject[] objectArray, String fieldName){ | |
if(isEmpty(objectArray) || StringUtils.isBlank(fieldName)){ | |
return new Object[]{}; | |
} | |
Object[] plucked = new Object[objectArray.size()]; | |
for(Integer i = 0; i < objectArray.size(); i++){ | |
plucked[i] = objectArray[i].get(fieldName); | |
} | |
return plucked; | |
} | |
global static String toString(Object[] objectArray){ | |
if(objectArray == null){ | |
return 'null'; | |
} | |
String returnValue = '{'; | |
for(Integer i = 0; i < objectArray.size(); i++){ | |
if(i!=0){ returnValue += ','; } | |
returnValue += '\'' + objectArray[i] + '\''; | |
} | |
returnValue += '}'; | |
return returnValue; | |
} | |
global static String toString(SObject[] objectArray){ | |
if(objectArray == null){ | |
return 'null'; | |
} | |
String returnValue = '{'; | |
for(Integer i = 0; i < objectArray.size(); i++){ | |
if(i!=0){ returnValue += ','; } | |
returnValue += '\'' + objectArray[i] + '\''; | |
} | |
returnValue += '}'; | |
return returnValue; | |
} | |
global static void assertArraysAreEqual(Object[] expected, Object[] actual){ | |
//check to see if one param is null but the other is not | |
System.assert((expected == null && actual == null)|| (expected != null && actual != null), | |
'Assertion failed, the following two arrays are not equal. Expected: ' | |
+ ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual)); | |
if(expected != null && actual != null){ | |
System.assert(expected.size() == actual.size(), 'Assertion failed, the following two arrays are not equal. Expected: ' | |
+ ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual)); | |
for(Integer i = 0; i < expected.size(); i++){ | |
System.assert(expected[i] == actual[i], 'Assertion failed, the following two arrays are not equal. Expected: ' | |
+ ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual)); | |
} | |
} | |
} | |
global static void assertArraysAreEqual(SObject[] expected, SObject[] actual){ | |
//check to see if one param is null but the other is not | |
System.assert((expected == null && actual == null)|| (expected != null && actual != null), | |
'Assertion failed, the following two arrays are not equal. Expected: ' | |
+ ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual)); | |
if(expected != null && actual != null){ | |
System.assert(expected.size() == actual.size(), 'Assertion failed, the following two arrays are not equal. Expected: ' | |
+ ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual)); | |
for(Integer i = 0; i < expected.size(); i++){ | |
System.assert(expected[i] == actual[i], 'Assertion failed, the following two arrays are not equal. Expected: ' | |
+ ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual)); | |
} | |
} | |
} | |
/** | |
* This method is no longer needed as in Spring '10, you can created | |
* generic SObject lists. | |
* | |
* @deprecated | |
*/ | |
global static List<SObject> createEmptySObjectList(SObject prototype){ | |
if(prototype == null){ | |
return null; | |
} | |
return Database.query( | |
'select Id from ' | |
+ StringUtils.split(''+prototype,':')[0] | |
+ ' where Id = \'0015000000Mrr40\' LIMIT 0'); // use dummy Id to ensure no return | |
} | |
global static List<Object> merg(List<Object> list1, List<Object> list2) { | |
List<Object> returnList = new List<Object>(); | |
if(list1 != null && list2 != null && (list1.size()+list2.size()) > MAX_NUMBER_OF_ELEMENTS_IN_LIST){ | |
throw new IllegalArgumentException('Lists cannot be merged because new list would be greater than maximum number of elements in a list: ' + MAX_NUMBER_OF_ELEMENTS_IN_LIST); | |
} | |
if(isNotEmpty(list1)){ | |
for(Object elmt : list1){ | |
returnList.add(elmt); | |
} | |
} | |
if(isNotEmpty(list2)){ | |
for(Object elmt : list2){ | |
returnList.add(elmt); | |
} | |
} | |
return returnList; | |
} | |
global static List<SObject> merg(List<SObject> list1, List<SObject> list2) { | |
if(list1 != null && list2 != null && (list1.size()+list2.size()) > MAX_NUMBER_OF_ELEMENTS_IN_LIST){ | |
throw new IllegalArgumentException('Lists cannot be merged because new list would be greater than maximum number of elements in a list: ' + MAX_NUMBER_OF_ELEMENTS_IN_LIST); | |
} | |
if(isEmpty(list1) && isEmpty(list2)){ | |
return null; | |
} | |
List<SObject> returnList = createEmptySObjectList(isNotEmpty(list1) ? list1.get(0) : list2.get(0)); | |
if(list1 != null){ | |
for(SObject elmt : list1){ | |
returnList.add(elmt); | |
} | |
} | |
if(list2 != null){ | |
for(SObject elmt : list2){ | |
returnList.add(elmt); | |
} | |
} | |
return returnList; | |
} | |
global static List<Object> subset(List<Object> aList, Integer count) { | |
return subset(aList,0,count); | |
} | |
global static List<Object> subset(List<Object> list1, Integer startIndex, Integer count) { | |
List<Object> returnList = new List<Object>(); | |
if(list1 != null && list1.size() > 0 && startIndex >= 0 && startIndex <= list1.size()-1 && count > 0){ | |
for(Integer i = startIndex; i < list1.size() && i - startIndex < count; i++){ | |
returnList.add(list1.get(i)); | |
} | |
} | |
return returnList; | |
} | |
global static List<SObject> subset(List<SObject> aList, Integer count) { | |
return subset(aList,0,count); | |
} | |
global static List<SObject> subset(List<SObject> list1, Integer startIndex, Integer count) { | |
List<SObject> returnList = null; | |
if(list1 != null && list1.size() > 0 && startIndex <= list1.size()-1 && count > 0){ | |
returnList = createEmptySObjectList(list1.get(0)); | |
for(Integer i = startIndex; i < list1.size() && i - startIndex < count; i++){ | |
returnList.add(list1.get(i)); | |
} | |
} | |
return returnList; | |
} | |
//=============================================== | |
//LIST/ARRAY SORTING | |
//=============================================== | |
//FOR FORCE.COM PRIMITIVES (Double,Integer,ID,etc.): | |
global static List<Object> qsort(List<Object> theList) { | |
return qsort(theList,new PrimitiveComparator()); | |
} | |
global static List<Object> qsort(List<Object> theList, Boolean sortAsc) { | |
return qsort(theList,new PrimitiveComparator(),sortAsc); | |
} | |
global static List<Object> qsort(List<Object> theList, ObjectComparator comparator) { | |
return qsort(theList,comparator,true); | |
} | |
global static List<Object> qsort(List<Object> theList, ObjectComparator comparator, Boolean sortAsc) { | |
return qsort(theList, 0, (theList == null ? 0 : theList.size()-1),comparator,sortAsc); | |
} | |
//FOR SALESFORCE OBJECTS (sObjects): | |
global static List<SObject> qsort(List<SObject> theList, ISObjectComparator comparator) { | |
return qsort(theList,comparator,true); | |
} | |
global static List<SObject> qsort(List<SObject> theList, ISObjectComparator comparator,Boolean sortAsc ) { | |
return qsort(theList, 0, (theList == null ? 0 : theList.size()-1),comparator,sortAsc); | |
} | |
private static List<Object> qsort(List<Object> theList, | |
Integer lo0, | |
Integer hi0, | |
ObjectComparator comparator, | |
Boolean sortAsc){ | |
Integer lo = lo0; | |
Integer hi = hi0; | |
if (lo >= hi) { | |
return theList; | |
} else if( lo == hi - 1 ) { | |
if (( comparator.compare(theList[lo],theList[hi])>0 && sortAsc) || | |
(comparator.compare(theList[lo],theList[hi])<0 && !sortAsc) | |
) { | |
Object prs = theList[lo]; | |
theList[lo] = theList[hi]; | |
theList[hi] = prs; | |
} | |
return theList; | |
} | |
Object pivot = theList[(lo + hi) / 2]; | |
theList[(lo + hi) / 2] = theList[hi]; | |
theList[hi] = pivot; | |
while( lo < hi ) { | |
while ((comparator.compare(theList[lo], pivot)<=0 && lo < hi && sortAsc) || | |
(comparator.compare(theList[lo], pivot)>=0 && lo < hi && !sortAsc) | |
) { lo++; } | |
while (( comparator.compare(pivot,theList[hi])<=0 && lo < hi && sortAsc) || | |
( comparator.compare(pivot,theList[hi])>=0 && lo < hi && !sortAsc) | |
) { hi--; } | |
if( lo < hi ){ | |
Object prs = theList[lo]; | |
theList[lo] = theList[hi]; | |
theList[hi] = prs; | |
} | |
} | |
theList[hi0] = theList[hi]; | |
theList[hi] = pivot; | |
qsort(theList, lo0, lo-1,comparator,sortAsc); | |
qsort(theList, hi+1, hi0,comparator,sortAsc); | |
return theList; | |
} | |
private static List<SObject> qsort(List<SObject> theList, | |
Integer lo0, | |
Integer hi0, | |
ISObjectComparator comparator, | |
Boolean sortAsc){ | |
Integer lo = lo0; | |
Integer hi = hi0; | |
if (lo >= hi) { | |
return theList; | |
} else if( lo == hi - 1 ) { | |
if (( comparator.compare(theList[lo],theList[hi])>0 && sortAsc) || | |
(comparator.compare(theList[lo],theList[hi])<0 && !sortAsc) | |
) { | |
SObject prs = theList[lo]; | |
theList[lo] = theList[hi]; | |
theList[hi] = prs; | |
} | |
return theList; | |
} | |
SObject pivot = theList[(lo + hi) / 2]; | |
theList[(lo + hi) / 2] = theList[hi]; | |
theList[hi] = pivot; | |
while( lo < hi ) { | |
while ((comparator.compare(theList[lo], pivot)<=0 && lo < hi && sortAsc) || | |
(comparator.compare(theList[lo], pivot)>=0 && lo < hi && !sortAsc) | |
) { lo++; } | |
while (( comparator.compare(pivot,theList[hi])<=0 && lo < hi && sortAsc) || | |
( comparator.compare(pivot,theList[hi])>=0 && lo < hi && !sortAsc) | |
) { hi--; } | |
if( lo < hi ){ | |
SObject prs = theList[lo]; | |
theList[lo] = theList[hi]; | |
theList[hi] = prs; | |
} | |
} | |
theList[hi0] = theList[hi]; | |
theList[hi] = pivot; | |
qsort(theList, lo0, lo-1,comparator,sortAsc); | |
qsort(theList, hi+1, hi0,comparator,sortAsc); | |
return theList; | |
} | |
/* | |
global static List<Object> unique(List<Object> theList) { | |
List<Object> uniques = new List<Object>(); | |
Set<Object> keys = new Set<Object>(); | |
if(theList != null && theList.size() > 0){ | |
for(Object obj : theList){ | |
if(keys.contains(obj)){ | |
continue; | |
} else { | |
keys.add(obj); | |
uniques.add(obj); | |
} | |
} | |
} | |
return uniques; | |
} | |
global static List<SObject> unique(List<SObject> theList) { | |
if(theList == null){ | |
return null; | |
} | |
List<SObject> uniques = createEmptySObjectList(theList.get(0)); | |
Set<String> keys = new Set<String>(); | |
if(theList != null && theList.size() > 0){ | |
String key = null; | |
for(SObject obj : theList){ | |
key = obj == null ? null : ''+obj; | |
if(keys.contains(key)){ | |
continue; | |
} else { | |
keys.add(key); | |
uniques.add(obj); | |
} | |
} | |
} | |
return uniques; | |
} | |
*/ | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment