package org.itscool.commons.util;



/**
 * ソートプログラム
 * 改定履歴: 1.00A 2001/09/04 加納 充照 新規作成
*/
public class ArrayUtil{
    /**
     * int配列のソートプログラム
     * @param list int[]配列
     * @param mode true：昇順 false：降順
     * @return ソート後のint[]配列
     * 改定履歴: 1.00A 2001/09/04 加納 充照 新規作成
    */
    public static int[] sort(int[] list, boolean mode){
        if( mode ){
            return asc(list);
        }else{
            return dec(list);
        }
    }
    
    /**
     * int配列の昇順ソートプログラム
     * @param list int[]配列
     * @return ソート後のint[]配列
     * 改定履歴: 1.00A 2001/09/04 加納 充照 新規作成
    */
    protected static int[] asc(int[] list){
        
        // 最後の要素を除いて、すべての要素を並べ替えます
        for(int i=0;i<list.length-1;i++){
            // 下から上に順番に比較します
            for(int j=list.length-1;j>i;j--){
                // 上の方が大きいときは互いに入れ替えます
                if(list[j] < list[j-1]){
                    int t=list[j];
                    list[j]=list[j-1];
                    list[j-1]=t;
                }
            }
        }return list;
    }
    
    /**
     * int配列の降順ソートプログラム
     * @param list int[]配列
     * @return ソート後のint[]配列
     * 改定履歴: 1.00A 2001/09/04 加納 充照 新規作成
    */
    protected static int[] dec(int[] list){
        // 最後の要素を除いて、すべての要素を並べ替えます
        for(int i=0;i<list.length-1;i++){
            // 下から上に順番に比較します
            for(int j=list.length-1;j>i;j--){
                // 下の方が大きいときは互いに入れ替えます
                if(list[j] > list[j-1]){
                    int t=list[j];
                    list[j]=list[j-1];
                    list[j-1]=t;
                }
            }
        }return list;
    }
    
    /**
     * long配列のソートプログラム
     * @param list long[]配列
     * @param mode true：昇順 false：降順
     * @return ソート後のlong[]配列
     * 改定履歴: 1.00A 2001/09/04 加納 充照 新規作成
    */
    public static long[] sort(long[] list, boolean mode){
        if( mode ){
            return asc(list);
        }else{
            return dec(list);
        }
    }
    
    /**
     * long配列の昇順ソートプログラム
     * @param list long[]配列
     * @return ソート後のlong[]配列
     * 改定履歴: 1.00A 2001/09/04 加納 充照 新規作成
    */
    protected static long[] asc(long[] list){
        
        // 最後の要素を除いて、すべての要素を並べ替えます
        for(int i=0;i<list.length-1;i++){
            // 下から上に順番に比較します
            for(int j=list.length-1;j>i;j--){
                // 上の方が大きいときは互いに入れ替えます
                if(list[j] < list[j-1]){
                    long t=list[j];
                    list[j]=list[j-1];
                    list[j-1]=t;
                }
            }
        }return list;
    }
    
    /**
     * long配列の降順ソートプログラム
     * @param list long[]配列
     * @return ソート後のlong[]配列
     * 改定履歴: 1.00A 2001/09/04 加納 充照 新規作成
    */
    protected static long[] dec(long[] list){
        // 最後の要素を除いて、すべての要素を並べ替えます
        for(int i=0;i<list.length-1;i++){
            // 下から上に順番に比較します
            for(int j=list.length-1;j>i;j--){
                // 下の方が大きいときは互いに入れ替えます
                if(list[j] > list[j-1]){
                    long t=list[j];
                    list[j]=list[j-1];
                    list[j-1]=t;
                }
            }
        }return list;
    }
    
    /**
     * double配列のソートプログラム
     * @param list double[]配列
     * @param mode true：昇順 false：降順
     * @return ソート後のdouble[]配列
     * 改定履歴: 1.00A 2001/09/04 加納 充照 新規作成
    */
    public static double[] sort(double[] list, boolean mode){
        if( mode ){
            return asc(list);
        }else{
            return dec(list);
        }
    }
    
    /**
     * double配列の昇順ソートプログラム
     * @param list double[]配列
     * @return ソート後のdouble[]配列
     * 改定履歴: 1.00A 2001/09/04 加納 充照 新規作成
    */
    protected static double[] asc(double[] list){
        
        // 最後の要素を除いて、すべての要素を並べ替えます
        for(int i=0;i<list.length-1;i++){
            // 下から上に順番に比較します
            for(int j=list.length-1;j>i;j--){
                // 上の方が大きいときは互いに入れ替えます
                if(list[j] < list[j-1]){
                    double t=list[j];
                    list[j]=list[j-1];
                    list[j-1]=t;
                }
            }
        }return list;
    }
    
    /**
     * double配列の降順ソートプログラム
     * @param list double[]配列
     * @return ソート後のdouble[]配列
     * 改定履歴: 1.00A 2001/09/04 加納 充照 新規作成
    */
    protected static double[] dec(double[] list){
        // 最後の要素を除いて、すべての要素を並べ替えます
        for(int i=0;i<list.length-1;i++){
            // 下から上に順番に比較します
            for(int j=list.length-1;j>i;j--){
                // 下の方が大きいときは互いに入れ替えます
                if(list[j] > list[j-1]){
                    double t=list[j];
                    list[j]=list[j-1];
                    list[j-1]=t;
                }
            }
        }return list;
    }
    
    /**
     * 文字列配列のソートプログラム<br>
     * @param list String[]配列
     * @param mode true：昇順 false：降順
     * @return ソート後のString[]配列
     * 改定履歴: 1.00A 2001/09/04 加納 充照 新規作成
    */
    public static String[] sort(String[] list, boolean mode){
        if( mode ){
            return asc(list);
        }else{
            return dec(list);
        }
    }
    
    /**
     * 文字列配列の昇順ソートプログラム<br>
     * @param list String[]配列
     * @return ソート後のString[]配列
     * 改定履歴: 1.00A 2001/09/04 加納 充照 新規作成
    */
    protected static String[] asc(String[] list ){
        // 最後の要素を除いて、すべての要素を並べ替えます
        for(int i=0;i<list.length-1;i++){
            // 下から上に順番に比較します
            for(int j=list.length-1;j>i;j--){
                // 上の方が大きいときは互いに入れ替えます
                if(list[j].compareTo(list[j-1]) < 0 ){
                    String t = list[j];
                    list[j] = list[j-1];
                    list[j-1] = t;
                }
            }
        }return list;
    }
    
    /**
     * 文字列配列の降順ソートプログラム<br>
     * @param list String[]配列
     * @return ソート後のString[]配列
     * 改定履歴: 1.00A 2001/09/04 加納 充照 新規作成
    */
    protected static String[] dec(String[] list ){
    
        // 最後の要素を除いて、すべての要素を並べ替えます
        for(int i=0;i<list.length-1;i++){
            // 下から上に順番に比較します
            for(int j=list.length-1;j>i;j--){
                // 上の方が大きいときは互いに入れ替えます
                if(list[j].compareTo(list[j-1]) > 0 ){
                    String t = list[j];
                    list[j] = list[j-1];
                    list[j-1] = t;
                }
            }
        }return list;
    }
    
    /**
     * 引数で指定された配列が等しいか判定します
     * @param src 比較対照配列１
     * @param dst 比較対照配列２
     * @return 2つの配列が等しい場合はtrueを返します
     *
    */
    public static boolean isMatch(int[] src, int[] dst){
        boolean ret = true;
        if( src.length != dst.length ){
            return false;
        }
        
        for(int i=0;i<src.length;i++){
            if( src[i] != dst[i] ){
                return false;
            }
        }
        return ret;
    }
    
    /**
     * 引数で指定された配列が等しいか判定します
     * @param src 比較対照配列１
     * @param dst 比較対照配列２
     * @return 2つの配列が等しい場合はtrueを返します
     *
    */
    public static boolean isMatch(long[] src, long[] dst){
        boolean ret = true;
        if( src.length != dst.length ){
            return false;
        }
        
        for(int i=0;i<src.length;i++){
            if( src[i] != dst[i] ){
                return false;
            }
        }
        return ret;
    }
    
    /**
     * 引数で指定された配列が等しいか判定します
     * @param src 比較対照配列１
     * @param dst 比較対照配列２
     * @return 2つの配列が等しい場合はtrueを返します
     *
    */
    public static boolean isMatch(double[] src, double[] dst){
        boolean ret = true;
        if( src.length != dst.length ){
            return false;
        }
        
        for(int i=0;i<src.length;i++){
            if( src[i] != dst[i] ){
                return false;
            }
        }
        return ret;
    }
    
    /**
     * 引数で指定された配列が等しいか判定します
     * @param src 比較対照配列１
     * @param dst 比較対照配列２
     * @return 2つの配列が等しい場合はtrueを返します
     *
    */
    public static boolean isMatch(String[] src, String[] dst){
        boolean ret = true;
        if( src.length != dst.length ){
            return false;
        }
        
        for(int i=0;i<src.length;i++){
            if( src[i] != dst[i] ){
                return false;
            }
        }
        return ret;
    }
    
    /**
     * 指定された配列要素の文字列表現を返します
     * @param list 配列要素
     * @return 配列要素の文字列表現（各要素間はカンマ区切り）を返します
     */
    public static String getArrayString(int[] list){
        String ret = "";
        for(int i=0;i<list.length;i++){
            ret += list[i] + ", ";
        }
        return ret;
    }
    
    /**
     * 指定された配列要素の文字列表現を返します
     * @param list 配列要素
     * @return 配列要素の文字列表現（各要素間はカンマ区切り）を返します
     */
    public static String getArrayString(long[] list){
        String ret = "";
        for(int i=0;i<list.length;i++){
            ret += list[i] + ", ";
        }
        return ret;
    }
    
    /**
     * 指定された配列要素の文字列表現を返します
     * @param list 配列要素
     * @return 配列要素の文字列表現（各要素間はカンマ区切り）を返します
     */
    public static String getArrayString(double[] list){
        String ret = "";
        for(int i=0;i<list.length;i++){
            ret += list[i] + ", ";
        }
        return ret;
    }
    
    /**
     * 指定された配列要素の文字列表現を返します
     * @param list 配列要素
     * @return 配列要素の文字列表現（各要素間はカンマ区切り）を返します
     */
    public static String getArrayString(String[] list){
        String ret = "";
        for(int i=0;i<list.length;i++){
            ret += list[i] + ", ";
        }
        return ret;
    }
    
}