Package railo.runtime.type.util

Source Code of railo.runtime.type.util.ListUtil

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==0return 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;
  }
}
TOP

Related Classes of railo.runtime.type.util.ListUtil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.