题目:
当前目录下input.txt文件中有数字矩阵,每行为一条记录,行数不定,每条记录有5个字段,字段类型为正整数,字段间以逗号分隔,忽略空白字符(即可以有空格等),如:
1,1,2,4,2
1,2,1,4,2
3,2,1,99,66
73,189,22,11,1
55,3,2,9,2
6,8,1,2,9
2,2,1,1,8
1,6,99,8,5
输出要求
1、程序读入input.txt中的数据,经过排序后,输出到当前目录下output.txt文件中。
2、每条记录内部需要排序,从左到右升序,如 1,2,1,7,4 排序后为 1,1,2,4,7。
3、在记录内部排好序的基础上,记录间需要进行排序,排序要求是从上到下升序,每列都要比较,左边字段的优先级大于右边。
4、相同记录不要去掉,输入有多少条记录,输出需要有同样多条记录。
5、输出文件中除了题目要求的输出外,不要输出其他多余信息。
6、程序设计要有利于后期扩展,且符合公司编程规范。
如上面给出的那组数字的排序结果应该是:
1,1,2,2,4
1,1,2,2,4
1,1,2,2,8
1,2,3,66,99
1,2,6,8,9
1,6,5,8,99
1,11,22,73,189
2,2,3,9,55
代码为:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
public class SortTest {
private static int[][] inputData = null;
private static String errorMsg = null;
/**
* @param args
*/
public static void main(String[] args) {
try {
// 取得文件对象
File f = getFile(SortTest.class.getPackage().getName(),
"inputData.txt");
File outputFile = getFile(SortTest.class.getPackage().getName(),
"outputData.txt");
// 从inputData.txt中读取数据
readData(f);
// 对数据进行排序
sort();
// 输出排好序的数据
outputData(outputFile);
} catch (Exception e) {
// 有异常的处理
System.out.println("SYSTEM ERROR");
}
if (null != errorMsg)
System.out.println("handle failed");
else
// 数据错误的处理
System.out.println("handle successed");
}
/**
* 从指定的文件中读取数据到inputData中
* @param f File 源文件
*/
private static void readData(File f) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(f)));
String lineStr = br.readLine();
ArrayList dataList = new ArrayList();
while (null != lineStr) {
String[] tempDataStr = lineStr.split(",");
if (5 != tempDataStr.length) {
errorMsg = "DATA ERROR";
}
int[] lineData = new int[5];
for (int i = 0; i < 5; i++) {
lineData[i] = Integer.parseInt(tempDataStr[i]);
}
Arrays.sort(lineData);
dataList.add(lineData);
lineStr = br.readLine();
}
inputData = new int[dataList.size()][5];
for (int i = 0; i < dataList.size(); i++) {
int[] tempData = (int[]) dataList.get(i);
for (int j = 0; j < 5; j++) {
inputData[i][j] = tempData[j];
}
}
} catch (Exception e) {
errorMsg = "DATA ERROR";
}
}
/**
* 对intputData二维数组进行排序.
* 处理详细:
* 1、找出从第i行开始的最小行的行号smalles
* 2、将smalles行号所对应的行和i行对应行的数据交换
*/
public static void sort() {
for (int i = 0; i < inputData.length; i++) {
int smallest = findSmallestRow(i);
changeData(i, smallest);
}
}
/**
* 找出从第start行开始的最小行号.
* 处理详细:
* 先找出第0列中最小的行号的集合,再在这个集合中找出第1列中行号最小的集合,以此类推,直到找出第5列中行号最小的集合
* 将找到的集合中的第一个行号返回
* @param start int 开始行号
* @return int 从指定行开始的符合规则的行号
*/
public static int findSmallestRow(int start) {
int[] rowNums = new int[inputData.length-start];
for(int i = start; i < inputData.length; i++) {
rowNums[i-start] = i;
}
for (int j = 0; j < 5; j++) {
rowNums = findRow(rowNums, j);
}
return rowNums[0];
}
/**
* 从给定的行号集合中找出指定列中值最小的行号集合
* @param rowNums 指定行号集
* @param columNum 指定列
* @return int[] 从指定集合中找出的指定列中值最小的集合
*/
public static int[] findRow(int[] rowNums, int columNum) {
int smallData = Integer.MAX_VALUE;
int count = 0;
for (int i = 0; i < rowNums.length; i++) {
if (inputData[rowNums[i]][columNum] < smallData) {
smallData = inputData[rowNums[i]][columNum];
count = 1;
} else if (inputData[rowNums[i]][columNum] == smallData) {
count++;
}
}
int[] smallRowNums = new int[count];
int tempRowNum = 0;
for (int i = 0; i < rowNums.length; i++) {
if (inputData[rowNums[i]][columNum] == smallData) {
smallRowNums[tempRowNum] = rowNums[i];
tempRowNum++;
}
}
return smallRowNums;
}
/**
* 将指定的两行的数据交换
* @param columnA int 行号A
* @param columnB int 行号B
*/
public static void changeData(int columnA, int columnB) {
int[] tempData = new int[5];
for (int j = 0; j < 5; j++) {
tempData[j] = inputData[columnA][j];
inputData[columnA][j] = inputData[columnB][j];
inputData[columnB][j] = tempData[j];
}
}
/**
* 输出InputData中的数据到指定文件中
* @param f
*/
private static void outputData(File f) {
PrintStream ps = null;
try {
ps = new PrintStream(f);
if (null != errorMsg) {
ps.print(errorMsg);
return;
}
for (int i = 0; i < inputData.length; i++) {
for(int j = 0; j < 5; j++) {
ps.print(inputData[i][j]);
if (4 != j) ps.print(",");
}
ps.println();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != ps) {
ps.close();
}
}
}
private static File getFile(String pack, String file) {
pack = pack.replace('//', '/');
pack = pack.replace('.', '/');
File fileObj = null;
URL url = SortTest.class.getResource("/" + pack + "/" + file);
File f = new File(pack + "/" + file);
System.out.println(f.getAbsolutePath());
try {
URI uri = new URI(url.toString().replaceAll(" ", "%20"));
fileObj = new File(uri);
} catch (Exception e) {
}
if (fileObj.isFile())
return fileObj;
else return null;
}
}