顺时针 逆时针排序输出类:
能将二维数组 或者 将如下结构的输入文件:
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("\n");
}
}
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);
}
}
}
说明:
功能类支持文件和二维数组两种入参
验证类中可以 isFileTest 来选择验证哪种入参验证
input.txt放在工程下就可以
程序会有控制台和文件输出两种结果
输出文件默认为output.txt 可以再 new RingSort()之后进行更改输出文件名
然后再调用排序方法。
源文件 见附件
在下露拙 有不对或者可以改进的地方 望各位大侠不吝金玉。
分享到:
相关推荐
在平面直角坐标系中,给定一个点序列,判断这些点是否能够构成凸多边形,并且按照顺时针方向输出这些点。
NULL 博文链接:https://songdiantao.iteye.com/blog/1183807
将凸包的顶点按逆时针的顺序排序,代码用java实现,已经亲测验证成功
平面三个点 如果,则时逆时针,opencv符号正好相反如果,则时顺时针,opencv符号正好相反如果,则共线判断点在三角形内内 如果为顺时针,并且,,
对图像进行旋转变换,可顺时针,逆时针多次旋转
判断多边形的顺逆时针性,主要用于shapefile文件的判断空洞
q-上臂逆时针旋转 a-上臂顺时针旋转 w-前臂逆时针旋转 s-前臂顺时针旋转 e-手指1关节1逆时针旋转 d-手指1关节1顺时针旋转 r-手指1关节2逆时针旋转 f-手指1关节2顺时针旋转 t-手指2关节1顺时针旋转 g-手指2关节1...
2)循环的方向(即顺时针还是逆时针)是否根据成熟年龄而变化; 3)适应于SRR的回归线的斜率是否根据成熟年龄而变化。 结果如下:1)在本研究中分析的所有24只股票中,SRR的环路形状均得到识别; 2)到期年龄低时...
LISP写的CAD下判断多段线顺时针还是逆时针的程序 附加功能:判断两点的测量方位角
jQuery仿新浪微博图片顺时针(逆时针)旋转效果,供大家一起共同分享学习。
像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...
ArcgiS脚本工具--点排序编号:将点按照一定的空间位置进行排序编号 。
SQL Server 2005 杂谈 聚合 记录集 逆时针 顺时针 旋转 90度 doc
给定任意形状边界的像素坐标,该程序可以按顺时针或逆时针顺序对其进行排序,而不管它是 4 还是 8 连接。
仪表盘可以实现顺时针和逆时针的摆动,指针精确指定位置
SQL Server2005杂谈(5):将聚合记录集逆时针和顺时针旋转90度.在输出统计结果时可能需要将列变成行,而将聚合结果(如count、sum)作为记录的第一行
G03------逆时针方向圆弧插补 G04------定时暂停 G05------通过中间点圆弧插补 G06------抛物线插补 G07------Z 样条曲线插补 G08------进给加速 G09------进给减速 G10------数据设置
各种道具详细说明如下: 游戏中旋转的石头:能够阻挡诺亚的前进,当诺亚经过石头后,石头会顺时针旋转90度。在使用魔法棒时也可使所有石头按魔法棒的方向旋转90度。 游戏中的钥匙和锁:一种颜色的钥匙只能开一把锁。...
主要介绍了java实现的顺时针/逆时针打印矩阵操作,涉及java基于数组的矩阵存储、遍历、打印输出等相关操作技巧,需要的朋友可以参考下
用c语言实现矩阵不同方式的输出,应用循环语句,嵌套定义。三种方式之间的转换。