JAva回転ソート--時計回りソート反時計回りソート

13052 ワード

出力クラスを時計回りに反時計回りに並べ替える:2 D配列または次の構造の入力ファイルを並べ替えることができます.
12,2 ,11,8 ,17
1 ,13,3 ,9 ,18
4 ,10,16,7 ,19
5 ,15,14,6 ,20
25,23,24,21,22

出力:
1、中から反時計回り
25,	24,	23,	22,	21
10,	9,	8,	7,	20
11,	2,	1,	6,	19
12,	3,	4,	5,	18
13,	14,	15,	16,	17

2、中から時計回りに
25,	10,	11,	12,	13
24,	9,	2,	3,	14
23,	8,	1,	4,	15
22,	7,	6,	5,	16
21,	20,	19,	18,	17

3、外から反時計回り
1,	16,	15,	14,	13
2,	17,	24,	23,	12
3,	18,	25,	22,	11
4,	19,	20,	21,	10
5,	6,	7,	8,	9

4、時計回りに外側から内側へ
1,	2,	3,	4,	5
16,	17,	18,	19,	6
15,	24,	25,	20,	7
14,	23,	22,	21,	8
13,	12,	11,	10,	9

このような方法はN*Mのマトリクス構造をサポートし、境界値が検証されていない可能性があり、よく見られるマトリクスは正常に動作し、ペンの試験問題や試験問題に使用することができます.コードは以下の通りです(ソースファイルは添付ファイルを参照してください):機能実装クラス:
package exericse.two;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;

/**
 *                                 
 * 
 * @author panyin
 * 
 */
public class RingSort
{
    //     
    private int[] intArr;
    
    //     
    private int[][] int2Arr;
    
    //        
    private int xmax;
    
    //        
    private int ymax;
    
    //        
    private int xmin = 1;
    
    //        
    private int ymin = 0;
    
    // i       x y            
    private int i, x = 0, y = 0;
    
    private boolean isSomethingWrong = false;
    
    
    private boolean inoutControl = false;

    // 0      1     
    private int inoutFlag = 0;
    
    private String outputFileName = "output.txt";
    
    /**
     *     
     * 
     * @return         
     */
    public int[][] sort2Ring(int[][] tempArr, int flag, int inoutFlag)
    {
        this.inoutFlag = inoutFlag;
        
        if (flag == 1)
        {
            xmin = 0;
            ymin = 1;
        }
        this.xmax = tempArr.length - 1;
        this.ymax = tempArr[0].length - 1;
        this.int2Arr = tempArr;
        
        arr2to1();
        
        if (inoutFlag == 1)
        {
            i = intArr.length - 1;
            inoutControl = i >= 0;
        }
        else
        {
            i = 0;
            inoutControl = i < intArr.length;
        }
        
        //      
        if (flag == 1)
        {
            anticlockwise();
        }
        
        //      
        else
        {
            clockwise();
        }
        
        if (isSomethingWrong)
        {
            return null;
        }
        
        output2File();
        
        return int2Arr;
    }
    
    public void sort2Ring(String fileName, int flag, int inoutFlag)
    {
        this.inoutFlag = inoutFlag;
        
        if (flag == 1)
        {
            xmin = 0;
            ymin = 1;
        }
        
        intArr = stringArr2IntArr(readFile2Arr(fileName));
        
        if (inoutFlag == 1)
        {
            i = intArr.length - 1;
            inoutControl = i >= 0;
        }
        else
        {
            i = 0;
            inoutControl = i < intArr.length;
        }
        
        this.int2Arr = new int[xmax + 1][ymax + 1];
        
        //      
        if (flag == 1)
        {
            anticlockwise();
        }
        
        //      
        else
        {
            clockwise();
        }
        
        output2File();
    }
    
    private String[] readFile2Arr(String fileName)
    {
        BufferedReader br = null;
        String[] strArr = null;
        try
        {
            br = new BufferedReader(new FileReader(fileName));
            String temp = null;
            
            StringBuilder sb = new StringBuilder();
            temp = br.readLine();
            
            if (temp == null)
            {
                isSomethingWrong = true;
            }
            
            while (null != temp)
            {
                if (!temp.trim().equals(""))
                {
                    sb.append(temp + ",");
                }
                //         
                temp = br.readLine();
                
                if (null != temp && !temp.trim().equals(""))
                {
                    ymax = temp.split(",").length - 1;
                    xmax++;
                }
                
            }
            
            strArr = sb.toString().substring(0, sb.toString().length() - 1).split(",");
        }
        catch (IOException e)
        {
            return null;
        }
        finally
        {
            try
            {
                br.close();
            }
            catch (IOException e)
            {
                isSomethingWrong = true;
            }
        }
        
        return strArr;
        
    }
    
    //  String     int          null
    public int[] stringArr2IntArr(String[] strArr)
    {
        int[] inArr = new int[strArr.length];
        for (int i = 0; i < strArr.length; i++)
        {
            try
            {
                inArr[i] = Integer.parseInt(strArr[i].trim());
            }
            catch (NumberFormatException e)
            {
                isSomethingWrong = true;
            }
        }
        
        Arrays.sort(inArr);
        
        return inArr;
    }
    
    //                   
    private void arr2to1()
    {
        intArr = new int[(xmax + 1) * (ymax + 1)];
        int m = 0;
        for (int k = 0; k <= xmax; k++)
        {
            for (int j = 0; j <= ymax; j++)
            {
                intArr[m++] = int2Arr[k][j];
                int2Arr[k][j] = 0;
            }
        }
        Arrays.sort(intArr);
    }
    
    private void anticlockwise()
    {
        while (i < intArr.length)
        {
            up2down();
            left2right();
            down2up();
            right2left();
            if (xmax == xmin || ymax == ymin)
            {
                int2Arr[x][y] = intArr[i];
                break;
            }
            changeLocation();
        }
    }
    
    private void clockwise()
    {
        while (i < intArr.length)
        {
            left2right();
            up2down();
            right2left();
            down2up();
            if (xmax == xmin || ymax == ymin)
            {
                int2Arr[x][y] = intArr[i];
                break;
            }
            changeLocation();
        }
    }
    
    //     
    private void up2down()
    {
        while (x < xmax && inoutControl)
        {
            int2Arr[x++][y] = intArr[i];
            if (inoutFlag == 0)
            {
                i++;
            }
            else
            {
                i--;
            }
        }
        
    }
    
    //     
    private void left2right()
    {
        while (y < ymax && inoutControl)
        {
            int2Arr[x][y++] = intArr[i];
            if (inoutFlag == 0)
            {
                i++;
            }
            else
            {
                i--;
            }
        }
        
    }
    
    //     
    private void down2up()
    {
        while (x > xmin && inoutControl)
        {
            int2Arr[x--][y] = intArr[i];
            if (inoutFlag == 0)
            {
                i++;
            }
            else
            {
                i--;
            }
        }
        
    }
    
    //     
    private void right2left()
    {
        while (y > ymin && inoutControl)
        {
            int2Arr[x][y--] = intArr[i];
            if (inoutFlag == 0)
            {
                i++;
            }
            else
            {
                i--;
            }
        }
        
    }
    
    private void changeLocation()
    {
        xmax--;
        ymax--;
        xmin++;
        ymin++;
    }
    
    private void output2File()
    {
        try
        {
            FileWriter fw = new FileWriter(outputFileName);
            StringBuilder sb = new StringBuilder();
            if (isSomethingWrong)
            {
                sb.append("input error!");
            }
            else
            {
                for (int j = 0; j < int2Arr.length; j++)
                {
                    for (int k = 0; k < int2Arr[0].length; k++)
                    {
                        sb.append(int2Arr[j][k]);
                        if (k < int2Arr[0].length - 1)
                        {
                            sb.append(",\t");
                        }
                    }
                    sb.append("
"); } } fw.write(sb.toString()); fw.flush(); fw.close(); System.out.println(sb.toString()); } catch (IOException e) { e.printStackTrace(); } } /** * outputFileName * @return outputFileName */ public String getOutputFileName() { return outputFileName; } /** * outputFileName * @param outputFileName outputFileName */ public void setOutputFileName(String outputFileName) { this.outputFileName = outputFileName; } }

単純検証クラス:
package exericse.two;

public class TestRingSort
{
    
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        
        //                  
        boolean isFileTest = true;
        
        String fileName = "input.txt";
        
        //      0     1               
        int flag = 0;
        
        // 0      1     
        int inoutFlag = 0;
        
        if (isFileTest)
        {
            new RingSort().sort2Ring(fileName, flag, inoutFlag);
        }
        else
        {
            int xmax = 5, ymax = 5;
            int[][] int2Arr = new int[xmax][ymax];
            int m = 1;
            for (int j = 0; j < int2Arr.length; j++)
            {
                for (int k = 0; k < int2Arr[0].length; k++)
                {
                    int2Arr[j][k] = m++;
                }
            }
            
            new RingSort().sort2Ring(int2Arr, flag, inoutFlag);
            
        }
    }
}

説明:機能クラスサポートファイルと2 D配列の2種類のインバウンドクラスでisFileTestを選択して、どのインバウンド検証inputを検証するかを選択できます.txtは工事の下に置くことができて、プログラムはコンソールとファイルの出力の2種類の結果の出力ファイルがデフォルトでoutput.txtは、new RingSort()の後、出力ファイル名を変更してソート方法を呼び出すことができます.ソースファイルは添付ファイルを参照してください.下手で間違いがあるか、改善できるところがあります.皆さん、金玉を惜しまないでください.