int []array={1,1,1,2,3,3,3,3,4,4,6,8,8,10};
上面这个整型数组,是按照从大到小排列,我现在需要把它重组为1.按照相同数的多少排列2,在相同数一样的情况下,按大小排列.
上面的数组需要重新排列成{3,3,3,3,1,1,1,4,4,8,8,2,6,10};我自己写了一个,按递归排列,先排列有4个数相同的,然后递减,3个相同数,2个相同数,但是没写好,在这里请教一下各位了.
谢谢!

解决方案 »

  1.   

    这个全放进map计数之后生成新数组貌似容易些。直接排序的算法暂时还想不出。
      

  2.   

    不用map做的,思路就是你那个,参考下吧
    public static void main(String[] args) {
    /*
     * 按照相同数的多少排列2,在相同数一样的情况下,按大小排列.
     * 数组需要重新排列成{3,3,3,3,1,1,1,4,4,8,8,2,6,10};
     */
    int[] array={1,1,1,2,3,3,3,3,4,4,6,8,8,10};
    //创建拷贝数组
    int[] copyArray = new int[array.length];
    //创建原始数组的每一个元素集合
    Set arraySet1=new HashSet();
    for(int i =0;i<array.length;i++){
    arraySet1.add(array[i]);
    }
    //创建新Set,记录所有交换过的数字
    Set arraySet2 = new HashSet();
    //记录拷贝数组的大小
    int size=0;

    /*
     * 当没有对原数组中所有元素进行重排序时,
     * 反复循环找出出现次数最多的且没有进行重排序一个值
     * 放到新数组中
     */
    while(!arraySet2.containsAll(arraySet1)){
    Integer num = array[1];
    Integer maxNum=null;
    int count = 1;
    int maxCount=0;
    for(int i =1;i<array.length;i++){
    if(array[i]==array[i-1]){
    count++;
    }else{
    num=array[i];
    count=1;
    }
    if(count>maxCount&&!arraySet2.contains(num)){
    maxCount=count;
    maxNum=num;
    }
    }
    int length = size+maxCount;
    for(int i=size;i<length;i++){
    copyArray[i]=maxNum;
    size++;
    }
    arraySet2.add(maxNum);
    }
    for(int i=0;i<copyArray.length;i++){
    System.out.print(copyArray[i]+" ");
    }
    }result:3 3 3 3 1 1 1 4 4 8 8 2 6 10