最近一直来研究算法,先从简单的开始,但是好像我的思维总跟不上,一直找不到根源,特来求教。
请高手指点,希望在我的源代码上改,不要偏离我的逻辑主题(面向对象的),谢谢
import java.util.TreeMap;
import java.util.TreeSet;/**
 * 对数字进行排序
 * 然后在给排序的数字进行区间分配
 * @author Administrator
 * 实现效果:
 * [20002,20001]
 * [8005]
 * [300]
 * [65,64]
 * [62]
 * [53,50]
 * [25,20]
 * [5]
 * [2,1]
 *
 */public class TestCompositor {
///*******************数组元素
static int []a = {1,300,20,21,22,24,25,50,51,53,23,20001,2,5,8005,65,52,64,62,20002}; 
//static int []a = {1,2,3,4}; 
//static int []a = {4,3,2,1};
///*******************计数器x
static int count = 0;
///*******************计数器y
static int countNum = 0;
// ///*******************设置二维数组
// static int [][] arr = new int[9][];


static int arr[] = new int[0];

public static void main(String[] args) {
// ///*****************定义对象变量
TestCompositor tc = new TestCompositor();
///*****************调用排序方法
tc.Compositor(a);
///*****************调用插入二维数组数据方法
tc.groupArr(a);
// ///******************把二维数组中的 数据打印出来
// for(int []a:arr){
// for(int b:a){
// System.out.print(" "+b);
// }
// }
//System.out.println(count);
//
// for(int i = 0;i<arr.length;i++){
// System.out.println(arr[i]);
// }
}

/**
 * 本意是设置一个自动变长数组
 * @param x 下标值
 * @param i 值
 * @return
 */
private int[] getArr(int x,int i){
// arr = new int[x];
// arr[x] = i;
////*******************判断传进来的值是否为空
if(Integer.valueOf(i)!=null){
////*****************定义一个替代数组
int []abs = new int[arr.length];
////*****************判断数组是否为空,不为空,则进行数组递增
////*****************为空则进行数组赋值
if(arr!=null){
for(int a =0;a<arr.length;a++){
abs[a] = arr[a];
//System.out.println(abs[a]);
}
System.out.println("  "+arr.length);
arr = new int[x+1];

for(int a =0;a<abs.length;a++){
arr[a] = abs[a] ;
}

arr[x] = i;
}else{
arr = new int[x+1];
arr[x] = i;
}
return arr;

}else{
return arr;
}
}


/**
 * 插入二维数组数据的方法
 * @param a
 */
private void groupArr(int[] a) {
//System.out.println(" length:"+a.length);
for(int i = 0;i<a.length-1;i++){
if(a[i]-1==a[i+1]){

System.out.print(a[i]+" ");
if(i >= a.length-2){
System.out.println(a[i+1]+" ");
//getArr(count+1,a[i+1]);
}
getArr(count,a[i]);
}else{
System.out.println(a[i]+"");
if(i > a.length-2){
System.out.println(a[i+1]);
//getArr(count+1,a[i+1]);
}
//count++;
getArr(count,a[i]);
}
count++;
};
} /**
 * 行进排序的方法
 * @param a
 */
private void Compositor(int []a) {
for(int i = 1;i<a.length;i++){
if(a[i]>a[i-1]){
int temp = a[i];
a[i] = a[i-1];
a[i-1] = temp;
}
};
if(comNum(a)){
return ;
}else{
Compositor(a);
};
}

/**
 * 判断数组中数据的大小排列数否为顺序排列
 * @param a
 * @return
 */
public boolean comNum(int []a){
for(int i = 1;i<a.length;i++){
if(a[i]<a[i-1]){
if(i==a.length-1){
return true;
}
}else{
return false;
}
}
return false;
}
}

解决方案 »

  1.   

    最后一个方法 comNum 写得就非常槽糕。
      

  2.   

    import java.util.TreeMap;
    import java.util.TreeSet;
    import java.util.*;/**
     * 对数字进行排序
     * 然后在给排序的数字进行区间分配
     * @author Administrator
     * 实现效果:
     * [20002,20001]
     * [8005]
     * [300]
     * [65,64]
     * [62]
     * [53,50]
     * [25,20]
     * [5]
     * [2,1]
     *
     */public class TestCompositor {
    //???????????????既然用在主程序中用了new,为什么下面属性都是静态的?而且都把数据定死????????
        ///*******************数组元素
        static int []a = {1,300,20,21,22,24,25,50,51,53,23,20001,2,5,8005,65,52,64,62,20002}; 
        //static int []a = {1,2,3,4}; 
        //static int []a = {4,3,2,1};
        ///*******************计数器x
        static int count = 0;
        ///*******************计数器y
        static int countNum = 0;
    //    ///*******************设置二维数组这个保存结果。
        static Integer [][] groupArray = null;
        
        
        static int arr[] = new int[0];
        
        public static void main(String[] args) {
    //        ///*****************定义对象变量
            TestCompositor tc = new TestCompositor();
            ///*****************调用排序方法
            tc.Compositor(a);
            ///*****************调用插入二维数组数据方法
            tc.groupArr(a);
            for(int i=0;i<groupArray.length;i++){
             System.out.println(Arrays.toString(groupArray[i]));
            }
    //        ///******************把二维数组中的 数据打印出来
    //        for(int []a:arr){
    //            for(int b:a){
    //                System.out.print(" "+b);
    //            }
    //        }
            //System.out.println(count);
    //        
    //        for(int i = 0;i<arr.length;i++){
    //            System.out.println(arr[i]);
    //        }
        }
        
        /**
         * 本意是设置一个自动变长数组
         * @param x 下标值
         * @param i 值
         * @return
         */
         //???????????????你为什么不System.arraycopy()?????????
        private int[] getArr(int x,int i){
    //        arr = new int[x];
    //        arr[x] = i;
            ////*******************判断传进来的值是否为空
            
            if(Integer.valueOf(i)!=null){
                ////*****************定义一个替代数组
                int []abs = new int[arr.length];
                ////*****************判断数组是否为空,不为空,则进行数组递增
                ////*****************为空则进行数组赋值
                if(arr!=null){
                    for(int a =0;a<arr.length;a++){
                        abs[a] = arr[a];
                        //System.out.println(abs[a]);
                    }
                    System.out.println("  "+arr.length);
                    arr = new int[x+1];
                    
                    for(int a =0;a<abs.length;a++){
                        arr[a] = abs[a] ;
                    }
                    
                        arr[x] = i;
                }else{
                    arr = new int[x+1];
                    arr[x] = i;
                }
                return arr;
                
            }else{
                return arr;
            }
        }
        
        
        /**
         * 插入二维数组数据的方法
         * @param a
         */
         
         //?????????????我给你写这个方法吧???????????
        private void groupArr(int[] a) {
            //System.out.println(" length:"+a.length);
            int lianXu,i=0;
            ArrayList<Integer[]> result=new ArrayList<Integer[]>();
            for(;i<a.length-1;){
             ///假设连续数据是从第i个数据开始的。
             lianXu=i; 
             while(lianXu<a.length-1&&a[lianXu]==a[lianXu+1]+1) lianXu++;
             if(i!=lianXu){
             result.add(new Integer[]{a[i],a[lianXu]});
             i=lianXu+1;
             }else{
             result.add(new Integer[]{a[i]});
             i++;
             }
            }
            groupArray=result.toArray(new Integer[0][]);
                
        }    /**
         * 行进排序的方法
         * @param a
         */
         //????????这个排序效太低了????
        private void Compositor(int []a) {
            for(int i = 1;i<a.length;i++){
                if(a[i]>a[i-1]){
                    int temp = a[i];
                    a[i] = a[i-1];
                    a[i-1] = temp;
                }
            };
            if(comNum(a)){
                return ;
            }else{
                Compositor(a);
            };
        }
        
        /**
         * 判断数组中数据的大小排列数否为顺序排列
         * @param a
         * @return
         */
         //??????????老大说这个方法不好??????改一下吧????????
        public boolean comNum(int []a){
         boolean isSorted=true;
            for(int i = 1;i<a.length-1;i++){
                if(a[i]>a[i-1]){
                    isSorted=false;
                    break;
                }
            }
            return isSorted;
        }
    }
    结果:
    F:\java>java TestCompositor
    [20002, 20001]
    [8005]
    [300]
    [65, 64]
    [62]
    [53, 50]
    [25, 20]
    [5]
    [2, 1]F:\java>