package railo.runtime.type.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import railo.commons.lang.StringList;
import railo.commons.lang.StringUtil;
import railo.runtime.exp.ExpressionException;
import railo.runtime.exp.PageException;
import railo.runtime.op.Caster;
import railo.runtime.type.Array;
import railo.runtime.type.ArrayImpl;
import railo.runtime.type.Collection;
import railo.runtime.type.Collection.Key;
/**
* List is not a type, only some static method to manipulate String lists
*/
public final class ListUtil {
/**
* casts a list to Array object, the list can be have quoted (",') arguments and delimter in this arguments are ignored. quotes are not removed
* example:
* listWithQuotesToArray("aab,a'a,b',a\"a,b\"",",","\"'") will be translated to ["aab","a'a,b'","a\"a,b\""]
*
*
*
* @param list list to cast
* @param delimiter delimter of the list
* @param quotes quotes of the list
* @return Array Object
*/
public static Array listWithQuotesToArray(String list, String delimiter,String quotes) {
if(list.length()==0) return new ArrayImpl();
int len=list.length();
int last=0;
char[] del=delimiter.toCharArray();
char[] quo=quotes.toCharArray();
char c;
char inside=0;
ArrayImpl array=new ArrayImpl();
try{
for(int i=0;i<len;i++) {
c=list.charAt(i);
for(int y=0;y<quo.length;y++){
if(c==quo[y]) {
if(c==inside)inside=0;
else if(inside==0)inside=c;
continue;
}
}
for(int y=0;y<del.length;y++) {
if(inside==0 && c==del[y]) {
array._append(list.substring(last,i));
last=i+1;
break;
}
}
}
if(last<=len)array.append(list.substring(last));
}
catch(ExpressionException e){}
return array;
}
/**
* casts a list to Array object
* @param list list to cast
* @param delimiter delimter of the list
* @return Array Object
*/
public static Array listToArray(String list, String delimiter) {
if(delimiter.length()==1)return listToArray(list, delimiter.charAt(0));
if(list.length()==0) return new ArrayImpl();
if(delimiter.length()==0) {
int len = list.length();
ArrayImpl array=new ArrayImpl();
array.appendEL("");// ACF compatibility
for(int i=0;i<len;i++){
array.appendEL(list.charAt(i));
}
array.appendEL("");// ACF compatibility
return array;
}
int len=list.length();
int last=0;
char[] del=delimiter.toCharArray();
char c;
ArrayImpl array=new ArrayImpl();
try{
for(int i=0;i<len;i++) {
c=list.charAt(i);
for(int y=0;y<del.length;y++) {
if(c==del[y]) {
array.appendEL(list.substring(last,i));
last=i+1;
break;
}
}
}
if(last<=len)array.append(list.substring(last));
}
catch(ExpressionException e){}
return array;
}
public static Array listToArray(String list, String delimiter, boolean multiCharDelim) {
if(!multiCharDelim || delimiter.length()==0) return listToArray(list, delimiter);
if(delimiter.length()==1)return listToArray(list, delimiter.charAt(0));
int len=list.length();
if(len==0) return new ArrayImpl();
Array array=new ArrayImpl();
int from=0;
int index;
int dl=delimiter.length();
while((index=list.indexOf(delimiter,from))!=-1){
array.appendEL(list.substring(from,index));
from=index+dl;
}
array.appendEL(list.substring(from,len));
return array;
}
/**
* casts a list to Array object
* @param list list to cast
* @param delimiter delimter of the list
* @return Array Object
*/
public static Array listToArray(String list, char delimiter) {
if(list.length()==0) return new ArrayImpl();
int len=list.length();
int last=0;
Array array=new ArrayImpl();
try{
for(int i=0;i<len;i++) {
if(list.charAt(i)==delimiter) {
array.append(list.substring(last,i));
last=i+1;
}
}
if(last<=len)array.append(list.substring(last));
}
catch(PageException e){}
return array;
}
/**
* casts a list to Array object remove Empty Elements
* @param list list to cast
* @param delimiter delimter of the list
* @return Array Object
*/
public static Array listToArrayRemoveEmpty(String list, String delimiter, boolean multiCharDelim) {
if(!multiCharDelim || delimiter.length()==0) return listToArrayRemoveEmpty(list, delimiter);
if(delimiter.length()==1)return listToArrayRemoveEmpty(list, delimiter.charAt(0));
int len=list.length();
if(len==0) return new ArrayImpl();
Array array=new ArrayImpl();
int from=0;
int index;
int dl=delimiter.length();
while((index=list.indexOf(delimiter,from))!=-1){
if(from<index)array.appendEL(list.substring(from,index));
from=index+dl;
}
if(from<len)array.appendEL(list.substring(from,len));
return array;
}
public static Array listToArrayRemoveEmpty(String list, String delimiter) {
if(delimiter.length()==1)return listToArrayRemoveEmpty(list, delimiter.charAt(0));
int len=list.length();
ArrayImpl array=new ArrayImpl();
if(len==0) return array;
if(delimiter.length()==0) {
for(int i=0;i<len;i++){
array.appendEL(list.charAt(i));
}
return array;
}
int last=0;
char[] del = delimiter.toCharArray();
char c;
for(int i=0;i<len;i++) {
c=list.charAt(i);
for(int y=0;y<del.length;y++) {
if(c==del[y]) {
if(last<i)array._append(list.substring(last,i));
last=i+1;
break;
}
}
}
if(last<len)array._append(list.substring(last));
return array;
}
/**
* casts a list to Array object remove Empty Elements
* @param list list to cast
* @param delimiter delimter of the list
* @return Array Object
*/
public static Array listToArrayRemoveEmpty(String list, char delimiter) {
int len=list.length();
ArrayImpl array=new ArrayImpl();
if(len==0) return array;
int last=0;
for(int i=0;i<len;i++) {
if(list.charAt(i)==delimiter) {
if(last<i)array._append(list.substring(last,i));
last=i+1;
}
}
if(last<len)array._append(list.substring(last));
return array;
}
public static List<String> toListRemoveEmpty(String list, char delimiter) {
int len=list.length();
List<String> array=new ArrayList<String>();
if(len==0) return array;
int last=0;
for(int i=0;i<len;i++) {
if(list.charAt(i)==delimiter) {
if(last<i)array.add(list.substring(last,i));
last=i+1;
}
}
if(last<len)array.add(list.substring(last));
return array;
}
/**
* casts a list to Array object remove Empty Elements
* @param list list to cast
* @param delimiter delimter of the list
* @return Array Object
*/
public static String rest(String list, String delimiter, boolean ignoreEmpty) {
//if(delimiter.length()==1)return rest(list, delimiter.charAt(0));
int len=list.length();
if(len==0) return "";
//int last=-1;
char[] del = delimiter.toCharArray();
char c;
if(ignoreEmpty)list=ltrim(list,del);
len=list.length();
for(int i=0;i<len;i++) {
c=list.charAt(i);
for(int y=0;y<del.length;y++) {
if(c==del[y]) {
return ignoreEmpty?ltrim(list.substring(i+1),del):list.substring(i+1);
}
}
}
return "";
}
private static String ltrim(String list,char[] del) {
int len=list.length();
char c;
// remove at start
outer:while(len>0) {
c=list.charAt(0);
for(int i=0;i<del.length;i++) {
if(c==del[i]) {
list=list.substring(1);
len=list.length();
continue outer;
}
}
break;
}
return list;
}
/**
* casts a list to Array object remove Empty Elements
* @param list list to cast
* @param delimiter delimter of the list
* @return Array Object
*/
public static StringList listToStringListRemoveEmpty(String list, char delimiter) {
int len=list.length();
StringList rtn=new StringList();
if(len==0) return rtn.reset();
int last=0;
for(int i=0;i<len;i++) {
if(list.charAt(i)==delimiter) {
if(last<i)rtn.add(list.substring(last,i));
last=i+1;
}
}
if(last<len)rtn.add(list.substring(last));
return rtn.reset();
}
/**
* casts a list to Array object, remove all empty items at start and end of the list
* @param list list to cast
* @param delimiter delimter of the list
* @return Array Object
*/
public static Array listToArrayTrim(String list, String delimiter) {
if(delimiter.length()==1)return listToArrayTrim(list, delimiter.charAt(0));
if(list.length()==0) return new ArrayImpl();
char[] del = delimiter.toCharArray();
char c;
// remove at start
outer:while(list.length()>0) {
c=list.charAt(0);
for(int i=0;i<del.length;i++) {
if(c==del[i]) {
list=list.substring(1);
continue outer;
}
}
break;
}
int len;
outer:while(list.length()>0) {
c=list.charAt(list.length()-1);
for(int i=0;i<del.length;i++) {
if(c==del[i]) {
len=list.length();
list=list.substring(0,len-1<0?0:len-1);
continue outer;
}
}
break;
}
return listToArray(list, delimiter);
}
/**
* casts a list to Array object, remove all empty items at start and end of the list and store count to info
* @param list list to cast
* @param delimiter delimter of the list
* @param info
* @return Array Object
*/
public static Array listToArrayTrim(String list, String delimiter, int[] info) {
if(delimiter.length()==1)return listToArrayTrim(list, delimiter.charAt(0),info);
if(list.length()==0) return new ArrayImpl();
char[] del = delimiter.toCharArray();
char c;
// remove at start
outer:while(list.length()>0) {
c=list.charAt(0);
for(int i=0;i<del.length;i++) {
if(c==del[i]) {
info[0]++;
list=list.substring(1);
continue outer;
}
}
break;
}
int len;
outer:while(list.length()>0) {
c=list.charAt(list.length()-1);
for(int i=0;i<del.length;i++) {
if(c==del[i]) {
info[1]++;
len=list.length();
list=list.substring(0,len-1<0?0:len-1);
continue outer;
}
}
break;
}
return listToArray(list, delimiter);
}
/**
* casts a list to Array object, remove all empty items at start and end of the list and store count to info
* @param list list to cast
* @param delimiter delimter of the list
* @param info
* @return Array Object
* @throws ExpressionException
*/
public static String listInsertAt(String list, int pos, String value, String delimiter, boolean ignoreEmpty) throws ExpressionException {
if(pos<1)
throw new ExpressionException("invalid string list index ["+(pos)+"]");
char[] del = delimiter.toCharArray();
char c;
StringBuilder result=new StringBuilder();
String end="";
int len;
// remove at start
if(ignoreEmpty){
outer:while(list.length()>0) {
c=list.charAt(0);
for(int i=0;i<del.length;i++) {
if(c==del[i]) {
list=list.substring(1);
result.append(c);
continue outer;
}
}
break;
}
}
// remove at end
if(ignoreEmpty){
outer:while(list.length()>0) {
c=list.charAt(list.length()-1);
for(int i=0;i<del.length;i++) {
if(c==del[i]) {
len=list.length();
list=list.substring(0,len-1<0?0:len-1);
end=c+end;
continue outer;
}
}
break;
}
}
len=list.length();
int last=0;
int count=0;
outer:for(int i=0;i<len;i++) {
c=list.charAt(i);
for(int y=0;y<del.length;y++) {
if(c==del[y]) {
if(!ignoreEmpty || last<i) {
if(pos==++count){
result.append(value);
result.append(del[0]);
}
}
result.append(list.substring(last,i));
result.append(c);
last=i+1;
continue outer;
}
}
}
count++;
if(last<=len){
if(pos==count) {
result.append(value);
result.append(del[0]);
}
result.append(list.substring(last));
}
if(pos>count) {
throw new ExpressionException("invalid string list index ["+(pos)+"], indexes go from 1 to "+(count));
}
return result+end;
}
/**
* casts a list to Array object, remove all empty items at start and end of the list
* @param list list to cast
* @param delimiter delimter of the list
* @return Array Object
*/
public static Array listToArrayTrim(String list, char delimiter) {
if(list.length()==0) return new ArrayImpl();
// remove at start
while(list.indexOf(delimiter)==0) {
list=list.substring(1);
}
int len=list.length();
if(len==0) return new ArrayImpl();
while(list.lastIndexOf(delimiter)==len-1) {
list=list.substring(0,len-1<0?0:len-1);
len=list.length();
}
return listToArray(list, delimiter);
}
/**
* @param list
* @param delimiter
* @return trimmed list
*/
public static StringList toListTrim(String list, char delimiter) {
if(list.length()==0) return new StringList();
// remove at start
while(list.indexOf(delimiter)==0) {
list=list.substring(1);
}
int len=list.length();
if(len==0) return new StringList();
while(list.lastIndexOf(delimiter)==len-1) {
list=list.substring(0,len-1<0?0:len-1);
len=list.length();
}
return toList(list, delimiter);
}
/**
* @param list
* @param delimiter
* @return list
*/
public static StringList toList(String list, char delimiter) {
if(list.length()==0) return new StringList();
int len=list.length();
int last=0;
StringList rtn=new StringList();
for(int i=0;i<len;i++) {
if(list.charAt(i)==delimiter) {
rtn.add(list.substring(last,i));
last=i+1;
}
}
if(last<=len)rtn.add(list.substring(last));
rtn.reset();
return rtn;
}
public static StringList toWordList(String list) {
if(list.length()==0) return new StringList();
int len=list.length();
int last=0;
char c,l=0;
StringList rtn=new StringList();
for(int i=0;i<len;i++) {
if(StringUtil.isWhiteSpace(c=list.charAt(i))) {
rtn.add(list.substring(last,i),l);
l=c;
last=i+1;
}
}
if(last<=len)rtn.add(list.substring(last),l);
rtn.reset();
return rtn;
}
/**
* casts a list to Array object, remove all empty items at start and end of the list
* @param list list to cast
* @param delimiter delimter of the list
* @param info
* @return Array Object
*/
public static Array listToArrayTrim(String list, char delimiter, int[] info) {
if(list.length()==0) return new ArrayImpl();
// remove at start
while(list.indexOf(delimiter)==0) {
info[0]++;
list=list.substring(1);
}
int len=list.length();
if(len==0) return new ArrayImpl();
while(list.lastIndexOf(delimiter)==len-1) {
info[1]++;
list=list.substring(0,len-1<0?0:len-1);
len=list.length();
}
return listToArray(list, delimiter);
}
/**
* finds a value inside a list, ignore case
* @param list list to search
* @param value value to find
* @return position in list (0-n) or -1
*/
public static int listFindNoCase(String list, String value) {
return listFindNoCase(list, value, ",", true);
}
/**
* finds a value inside a list, do not ignore case
* @param list list to search
* @param value value to find
* @param delimiter delimiter of the list
* @return position in list (0-n) or -1
*/
public static int listFindNoCase(String list, String value, String delimiter) {
return listFindNoCase(list, value, delimiter, true);
}
/**
* finds a value inside a list, do not ignore case
* @param list list to search
* @param value value to find
* @param delimiter delimiter of the list
* @param trim trim the list or not
* @return position in list (0-n) or -1
*/
public static int listFindNoCase(String list, String value, String delimiter,boolean trim) {
Array arr = trim?listToArrayTrim(list,delimiter):listToArray(list,delimiter);
int len=arr.size();
for(int i=1;i<=len;i++) {
if(((String)arr.get(i,"")).equalsIgnoreCase(value)) return i-1;
}
return -1;
}
public static int listFindForSwitch(String list, String value, String delimiter) {
if(list.indexOf(delimiter)==-1 && list.equalsIgnoreCase(value)) return 1;
Array arr = listToArray(list,delimiter);
int len=arr.size();
for(int i=1;i<=len;i++) {
if(((String)arr.get(i,"")).equalsIgnoreCase(value)) return i;
}
return -1;
}
/**
* finds a value inside a list, ignore case, ignore empty items
* @param list list to search
* @param value value to find
* @param delimiter delimiter of the list
* @return position in list or 0
*/
public static int listFindNoCaseIgnoreEmpty(String list, String value, String delimiter) {
if(delimiter.length()==1)return listFindNoCaseIgnoreEmpty(list, value, delimiter.charAt(0));
if(list==null) return -1;
int len=list.length();
if(len==0) return -1;
int last=0;
int count=0;
char[] del = delimiter.toCharArray();
char c;
for(int i=0;i<len;i++) {
c=list.charAt(i);
for(int y=0;y<del.length;y++) {
if(c==del[y]) {
if(last<i) {
if(list.substring(last,i).equalsIgnoreCase(value)) return count;
count++;
}
last=i+1;
break;
}
}
}
if(last<len) {
if(list.substring(last).equalsIgnoreCase(value)) return count;
}
return -1;
}
/**
* finds a value inside a list, ignore case, ignore empty items
* @param list list to search
* @param value value to find
* @param delimiter delimiter of the list
* @return position in list or 0
*/
public static int listFindNoCaseIgnoreEmpty(String list, String value, char delimiter) {
if(list==null) return -1;
int len=list.length();
if(len==0) return -1;
int last=0;
int count=0;
for(int i=0;i<len;i++) {
if(list.charAt(i)==delimiter) {
if(last<i) {
if(list.substring(last,i).equalsIgnoreCase(value)) return count;
count++;
}
last=i+1;
}
}
if(last<len) {
if(list.substring(last).equalsIgnoreCase(value)) return count;
}
return -1;
}
/**
* finds a value inside a list, case sensitive
* @param list list to search
* @param value value to find
* @return position in list or 0
*/
public static int listFind(String list, String value) {
return listFind(list, value, ",");
}
/**
* finds a value inside a list, do not case sensitive
* @param list list to search
* @param value value to find
* @param delimiter delimiter of the list
* @return position in list or 0
*/
public static int listFind(String list, String value, String delimiter) {
Array arr = listToArrayTrim(list,delimiter);
int len=arr.size();
for(int i=1;i<=len;i++) {
if(arr.get(i,"").equals(value)) return i-1;
}
return -1;
}
/**
* finds a value inside a list, case sensitive, ignore empty items
* @param list list to search
* @param value value to find
* @param delimiter delimiter of the list
* @return position in list or 0
*/
public static int listFindIgnoreEmpty(String list, String value, String delimiter) {
if(delimiter.length()==1)return listFindIgnoreEmpty(list, value, delimiter.charAt(0));
if(list==null) return -1;
int len=list.length();
if(len==0) return -1;
int last=0;
int count=0;
char[] del = delimiter.toCharArray();
char c;
for(int i=0;i<len;i++) {
c=list.charAt(i);
for(int y=0;y<del.length;y++) {
if(c==del[y]) {
if(last<i) {
if(list.substring(last,i).equals(value)) return count;
count++;
}
last=i+1;
break;
}
}
}
if(last<len) {
if(list.substring(last).equals(value)) return count;
}
return -1;
}
/**
* finds a value inside a list, case sensitive, ignore empty items
* @param list list to search
* @param value value to find
* @param delimiter delimiter of the list
* @return position in list or 0
*/
public static int listFindIgnoreEmpty(String list, String value, char delimiter) {
if(list==null) return -1;
int len=list.length();
if(len==0) return -1;
int last=0;
int count=0;
for(int i=0;i<len;i++) {
if(list.charAt(i)==delimiter) {
if(last<i) {
if(list.substring(last,i).equals(value)) return count;
count++;
}
last=i+1;
}
}
if(last<len) {
if(list.substring(last).equals(value)) return count;
}
return -1;
}
/**
* returns if a value of the list contains given value, ignore case
* @param list list to search in
* @param value value to serach
* @param delimiter delimiter of the list
* @return position in list or 0
*/
public static int listContainsNoCase(String list, String value, String delimiter) {
if(StringUtil.isEmpty(value)) return -1;
Array arr=listToArray(list,delimiter);
int len=arr.size();
for(int i=1;i<=len;i++) {
if(StringUtil.indexOfIgnoreCase(arr.get(i,"").toString(), value)!=-1) return i-1;
}
return -1;
}
/**
* returns if a value of the list contains given value, ignore case, ignore empty values
* @param list list to search in
* @param value value to serach
* @param delimiter delimiter of the list
* @return position in list or 0
*/
public static int listContainsIgnoreEmptyNoCase(String list, String value, String delimiter) {
if(StringUtil.isEmpty(value)) return -1;
Array arr=listToArrayRemoveEmpty(list,delimiter);
int count=0;
int len=arr.size();
for(int i=1;i<=len;i++) {
String item=arr.get(i,"").toString();
if(StringUtil.indexOfIgnoreCase(item, value)!=-1) return count;
count++;
}
return -1;
}
/**
* returns if a value of the list contains given value, case sensitive
* @param list list to search in
* @param value value to serach
* @param delimiter delimiter of the list
* @return position in list or 0
*/
public static int listContains(String list, String value, String delimiter) {
if(StringUtil.isEmpty(value)) return -1;
Array arr=listToArray(list,delimiter);
int len=arr.size();
for(int i=1;i<=len;i++) {
if(arr.get(i,"").toString().indexOf(value)!=-1) return i-1;
}
return -1;
}
/**
* returns if a value of the list contains given value, case sensitive, ignore empty positions
* @param list list to search in
* @param value value to serach
* @param delimiter delimiter of the list
* @return position in list or 0
*/
public static int listContainsIgnoreEmpty(String list, String value, String delimiter) {
if(StringUtil.isEmpty(value)) return -1;
Array arr=listToArrayRemoveEmpty(list,delimiter);
int count=0;
int len=arr.size();
for(int i=1;i<=len;i++) {
String item=arr.get(i,"").toString();
if(item.indexOf(value)!=-1) return count;
count++;
}
return -1;
}
/**
* convert a string array to string list, removes empty values at begin and end of the list
* @param array array to convert
* @param delimiter delimiter for the new list
* @return list generated from string array
*/
public static String arrayToListTrim(String[] array, String delimiter) {
return trim(arrayToList(array,delimiter),delimiter);
}
/**
* convert a string array to string list
* @param array array to convert
* @param delimiter delimiter for the new list
* @return list generated from string array
*/
public static String arrayToList(String[] array, String delimiter) {
if(ArrayUtil.isEmpty(array)) return "";
StringBuilder sb=new StringBuilder(array[0]);
if(delimiter.length()==1) {
char c=delimiter.charAt(0);
for(int i=1;i<array.length;i++) {
sb.append(c);
sb.append(array[i]);
}
}
else {
for(int i=1;i<array.length;i++) {
sb.append(delimiter);
sb.append(array[i]);
}
}
return sb.toString();
}
public static String arrayToList(Collection.Key[] array, String delimiter) {
if(array.length==0) return "";
StringBuilder sb=new StringBuilder(array[0].getString());
if(delimiter.length()==1) {
char c=delimiter.charAt(0);
for(int i=1;i<array.length;i++) {
sb.append(c);
sb.append(array[i].getString());
}
}
else {
for(int i=1;i<array.length;i++) {
sb.append(delimiter);
sb.append(array[i].getString());
}
}
return sb.toString();
}
/**
* convert Array Object to string list
* @param array array to convert
* @param delimiter delimiter for the new list
* @return list generated from string array
* @throws PageException
*/
public static String arrayToList(Array array, String delimiter) throws PageException {
if(array.size()==0) return "";
StringBuilder sb=new StringBuilder(Caster.toString(array.getE(1)));
int len=array.size();
for(int i=2;i<=len;i++) {
sb.append(delimiter);
sb.append(array.get(i,""));
}
return sb.toString();
}
public static String listToList(java.util.List<?> list, String delimiter) throws PageException {
if(list.size()==0) return "";
StringBuilder sb=new StringBuilder();
Iterator<?> it = list.iterator();
if(it.hasNext()) sb.append(Caster.toString(it.next()));
while(it.hasNext()) {
sb.append(delimiter);
sb.append(Caster.toString(it.next()));
}
return sb.toString();
}
/**
* trims a string array, removes all empty array positions at the start and the end of the array
* @param array array to remove elements
* @return cleared array
*/
public static String[] trim(String[] array) {
int from=0;
int to=0;
// test start
for(int i=0;i<array.length;i++) {
from=i;
if(array[i].length()!=0)break;
}
// test end
for(int i=array.length-1;i>=0;i--) {
to=i;
if(array[i].length()!=0)break;
}
int newLen=to-from+1;
if(newLen<array.length) {
String[] rtn=new String[newLen];
System.arraycopy(array,from,rtn,0,newLen);
return rtn;
}
return array;
}
/**
* trims a string list, remove all empty delimiter at start and the end
* @param list list to trim
* @param delimiter delimiter of the list
* @return trimed list
*/
public static String trim(String list, String delimiter) {
return trim(list,delimiter,new int[2]);
}
/**
* trims a string list, remove all empty delimiter at start and the end
* @param list list to trim
* @param delimiter delimiter of the list
* @param removeInfo int array contain count of removed values (removeInfo[0]=at the begin;removeInfo[1]=at the end)
* @return trimed list
*/
public static String trim(String list, String delimiter,int[] removeInfo) {
if(list.length()==0)return "";
int from=0;
int to=list.length();
//int len=delimiter.length();
char[] del=delimiter.toCharArray();
char c;
// remove at start
outer:while(list.length()>from) {
c=list.charAt(from);
for(int i=0;i<del.length;i++) {
if(c==del[i]) {
from++;
removeInfo[0]++;
//list=list.substring(from);
continue outer;
}
}
break;
}
//int len;
outer:while(to>from) {
c=list.charAt(to-1);
for(int i=0;i<del.length;i++) {
if(c==del[i]) {
to--;
removeInfo[1]++;
continue outer;
}
}
break;
}
int newLen=to-from;
if(newLen<list.length()) {
return list.substring(from,to);
}
return list;
}
/**
* sorts a string list
* @param list list to sort
* @param sortType sort type (numeric,text,textnocase)
* @param sortOrder sort order (asc,desc)
* @param delimiter list delimiter
* @return sorted list
* @throws PageException
*/
public static String sortIgnoreEmpty(String list, String sortType, String sortOrder, String delimiter) throws PageException {
return _sort(toStringArray(listToArrayRemoveEmpty(list,delimiter)),sortType, sortOrder, delimiter);
}
/**
* sorts a string list
* @param list list to sort
* @param sortType sort type (numeric,text,textnocase)
* @param sortOrder sort order (asc,desc)
* @param delimiter list delimiter
* @return sorted list
* @throws PageException
*/
public static String sort(String list, String sortType, String sortOrder, String delimiter) throws PageException {
return _sort(toStringArray(listToArray(list,delimiter)),sortType, sortOrder, delimiter);
}
private static String _sort(Object[] arr, String sortType, String sortOrder, String delimiter) throws PageException {
Arrays.sort(arr,ArrayUtil.toComparator(null, sortType, sortOrder, false));
StringBuilder sb=new StringBuilder();
for(int i=0;i<arr.length;i++) {
if(i!=0)sb.append(delimiter);
sb.append(arr[i]);
}
return sb.toString();
}
/**
* cast a Object Array to a String Array
* @param array
* @return String Array
*/
public static String[] toStringArrayEL(Array array) {
String[] arr=new String[array.size()];
for(int i=0;i<arr.length;i++) {
arr[i]=Caster.toString(array.get(i+1,null),null);
}
return arr;
}
/**
* cast a Object Array to a String Array
* @param array
* @return String Array
* @throws PageException
*/
public static String[] toStringArray(Array array) throws PageException {
String[] arr=new String[array.size()];
for(int i=0;i<arr.length;i++) {
arr[i]=Caster.toString(array.get(i+1,null));
}
return arr;
}
public static String[] toStringArray(Set<String> set) {
return set.toArray(new String[set.size()]);
}
public static String[] toStringArray(List<String> list) {
return list.toArray(new String[list.size()]);
}
/**
* cast a Object Array to a String Array
* @param array
* @param defaultValue
* @return String Array
*/
public static String[] toStringArray(Array array,String defaultValue) {
String[] arr=new String[array.size()];
for(int i=0;i<arr.length;i++) {
arr[i]=Caster.toString(array.get(i+1,defaultValue),defaultValue);
}
return arr;
}
/**
* cast a Object Array to a String Array and trim all values
* @param array
* @return String Array
* @throws PageException
*/
public static String[] toStringArrayTrim(Array array) throws PageException {
String[] arr=new String[array.size()];
for(int i=0;i<arr.length;i++) {
arr[i]=Caster.toString(array.get(i+1,"")).trim();
}
return arr;
}
/**
* return first element of the list
* @param list
* @param delimiter
* @return returns the first element of the list
* @deprecated use instead first(String list, String delimiter, boolean ignoreEmpty)
*/
public static String first(String list, String delimiter) {
return first(list, delimiter,true);
}
/**
* return first element of the list
* @param list
* @param delimiter
* @param ignoreEmpty
* @return returns the first element of the list
*/
public static String first(String list, String delimiter, boolean ignoreEmpty) {
if(StringUtil.isEmpty(list)) return "";
char[] del;
if(StringUtil.isEmpty(delimiter)) {
del=new char[]{','};
}
else {
del=delimiter.toCharArray();
}
int offset=0;
int index;
int x;
while(true) {
index=-1;
for(int i=0;i<del.length;i++) {
x=list.indexOf(del[i],offset);
if(x!=-1 && (x<index || index==-1))index=x;
}
//index=list.indexOf(index,offset);
if(index==-1) {
if(offset>0) return list.substring(offset);
return list;
}
if(!ignoreEmpty && index==0) {
return "";
}
else if(index==offset) {
offset++;
}
else {
if(offset>0)return list.substring(offset,index);
return list.substring(0,index);
}
}
}
/**
* return last element of the list
* @param list
* @param delimiter
* @return returns the last Element of a list
* @deprecated use instead last(String list, String delimiter, boolean ignoreEmpty)
*/
public static String last(String list, String delimiter) {
return last(list, delimiter, true);
}
/**
* return last element of the list
* @param list
* @param delimiter
* @param ignoreEmpty
* @return returns the last Element of a list
*/
public static String last(String list, String delimiter, boolean ignoreEmpty) {
if(StringUtil.isEmpty(list)) return "";
int len=list.length();
char[] del;
if(StringUtil.isEmpty(delimiter)) {
del=new char[]{','};
}
else del=delimiter.toCharArray();
int index;
int x;
while(true) {
index=-1;
for(int i=0;i<del.length;i++) {
x=list.lastIndexOf(del[i]);
if(x>index)index=x;
}
if(index==-1) {
return list;
}
else if(index+1==len) {
if(!ignoreEmpty) return"";
list=list.substring(0,len-1);
len--;
}
else {
return list.substring(index+1);
}
}
}
/**
* return last element of the list
* @param list
* @param delimiter
* @return returns the last Element of a list
*/
public static String last(String list, char delimiter) {
int len=list.length();
if(len==0) return "";
int index=0;
while(true) {
index=list.lastIndexOf(delimiter);
if(index==-1) {
return list;
}
else if(index+1==len) {
list=list.substring(0,len-1);
len--;
}
else {
return list.substring(index+1);
}
}
}
/**
* returns count of items in the list
* @param list
* @param delimiter
* @return list len
*/
public static int len(String list, char delimiter,boolean ignoreEmpty) {
int len=StringUtil.length(list);
if(len==0) return 0;
int count=0;
int last=0;
for(int i=0;i<len;i++) {
if(list.charAt(i)==delimiter) {
if(!ignoreEmpty || last<i)count++;
last=i+1;
}
}
if(!ignoreEmpty || last<len)count++;
return count;
}
/**
* returns count of items in the list
* @param list
* @param delimiter
* @return list len
*/
public static int len(String list, String delimiter, boolean ignoreEmpty) {
if(delimiter.length()==1)return len(list, delimiter.charAt(0),ignoreEmpty);
char[] del=delimiter.toCharArray();
int len=StringUtil.length(list);
if(len==0) return 0;
int count=0;
int last=0;
char c;
for(int i=0;i<len;i++) {
c=list.charAt(i);
for(int y=0;y<del.length;y++) {
if(c==del[y]) {
if(!ignoreEmpty || last<i)count++;
last=i+1;
break;
}
}
}
if(!ignoreEmpty || last<len)count++;
return count;
}
/* *
* cast a int into a char
* @param i int to cast
* @return int as char
* /
private char c(int i) {
return (char)i;
}*/
/**
* gets a value from list
* @param list list to cast
* @param delimiter delimter of the list
* @param position
* @return Array Object
*/
public static String getAt(String list, String delimiter, int position, boolean ignoreEmpty, String defaultValue) {
if(delimiter.length()==1)return getAt(list, delimiter.charAt(0), position,ignoreEmpty,defaultValue);
int len=list.length();
if(len==0) return defaultValue;
int last=-1;
int count=-1;
char[] del = delimiter.toCharArray();
char c;
for(int i=0;i<len;i++) {
c=list.charAt(i);
for(int y=0;y<del.length;y++) {
if(c==del[y]) {
if(ignoreEmpty && (last+1)==i) {
last=i;
break;
}
count++;
if(count==position) {
return list.substring(last+1,i);
}
last=i;
break;
}
}
}
if(position==count+1){
if(!ignoreEmpty || last+1<len) return list.substring(last+1);
}
return defaultValue;
}
/**
* get a elemnt at a specified position in list
* @param list list to cast
* @param delimiter delimter of the list
* @param position
* @return Array Object
*/
public static String getAt(String list, char delimiter, int position, boolean ignoreEmpty, String defaultValue) {
int len=list.length();
if(len==0) return defaultValue;
int last=-1;
int count=-1;
for(int i=0;i<len;i++) {
// char == delimiter
if(list.charAt(i)==delimiter) {
if(ignoreEmpty && (last+1)==i) {
last=i;
continue;
}
count++;
if(count==position) {
return list.substring(last+1,i);
}
last=i;
}
}
if(position==count+1){
if(!ignoreEmpty || last+1<len) return list.substring(last+1);
}
return defaultValue;
}
public static String[] listToStringArray(String list, char delimiter) {
Array array = ListUtil.listToArrayRemoveEmpty(list,delimiter);
String[] arr=new String[array.size()];
for(int i=0;i<arr.length;i++) {
arr[i]=Caster.toString(array.get(i+1,""),"");
}
return arr;
}
/**
* trim every single item of the array
* @param arr
* @return
*/
public static String[] trimItems(String[] arr) {
for(int i=0;i<arr.length;i++) {
arr[i]=arr[i].trim();
}
return arr;
}
/**
* trim every single item of the array
* @param arr
* @return
* @throws PageException
*/
public static Array trimItems(Array arr) throws PageException {
Key[] keys = CollectionUtil.keys(arr);
for(int i=0;i<keys.length;i++) {
arr.setEL(keys[i], Caster.toString(arr.get(keys[i],null)).trim());
}
return arr;
}
public static Set<String> listToSet(String list, String delimiter,boolean trim) {
if(list.length()==0) return new HashSet<String>();
int len=list.length();
int last=0;
char[] del=delimiter.toCharArray();
char c;
HashSet<String> set=new HashSet<String>();
for(int i=0;i<len;i++) {
c=list.charAt(i);
for(int y=0;y<del.length;y++) {
if(c==del[y]) {
set.add(trim?list.substring(last,i).trim():list.substring(last,i));
last=i+1;
break;
}
}
}
if(last<=len)set.add(list.substring(last));
return set;
}
public static Set<String> listToSet(String list, char delimiter,boolean trim) {
if(list.length()==0) return new HashSet<String>();
int len=list.length();
int last=0;
char c;
HashSet<String> set=new HashSet<String>();
for(int i=0;i<len;i++) {
c=list.charAt(i);
if(c==delimiter) {
set.add(trim?list.substring(last,i).trim():list.substring(last,i));
last=i+1;
}
}
if(last<=len)set.add(list.substring(last));
return set;
}
public static Set<String> toSet(String[] arr) {
Set<String> set=new HashSet<String>();
for(int i=0;i<arr.length;i++){
set.add(arr[i]);
}
return set;
}
}