文件读取二维数组和稀疏数组的转换
1、二维数组转稀疏数组。
将二维数组中的非0数添加到新的数组中,新数组中存储原数组的行列数,和有效数的坐标
稀疏数组的结构
三列多行的动态数组
第一行
第一列存储 行数
第二列存储 列数
第三列存储 非0个数
后面的行存储非0数的坐标
行 列 值
假设有二维数组
0 0 0 0
0 0 8 0
0 0 0 0
0 5 0 0
该二维数组为4行4列,其中有两个非0的数,坐标分别为8:(1,2)5:(3,1)
将其转换为稀疏数组结构为
4 4 2 表示原始数组为4*4,里面有两个非0的数
1 2 8 第一个数为8他在原始数组的坐标为(1,2)
3 1 5 第二个数为5他在原始数组的坐标为(3,1)
java代码实现
public static int[][] sparse(int[][] arr){
System.err.println("原始的二维数组");
for (int i = 0 ; i < arr.length ; i++ ){
for (int j = 0 ; j < arr[i].length ; j++ ){
System.out.printf("%d\t",arr[i][j]);
}
System.out.println();
}
//记录非0数的个数
int sum = 0;
//拼接得到的非0坐标
String string = "";
//行数
for (int i = 0 ; i < arr.length ; i++ ){
//列数
for (int j = 0 ; j < arr[i].length ; j++ ){
if (arr[i][j] != 0){
string += "["+ i + "," + j + "," + arr[i][j] +"]+";
sum ++ ;
}
}
}
System.err.println("开始转换稀疏数组");
//切割字符串得到非0坐标
String[] values = string.split("\\+");
int[][] sparseArr = new int[sum + 1][3];
//稀疏数组第一行赋值
sparseArr[0][0] = arr.length;
sparseArr[0][1] = arr[0].length;
sparseArr[0][2] = sum;
for (int i = 1 ; i < sparseArr.length ; i ++ ){
//将[1,1,3]的字符转替换并切割得到x,y,v
String[] v = values[i - 1].replaceAll("\\[","").replaceAll("]","").split(",");
for (int j = 0 ; j < 3 ; j ++ ){
sparseArr[i][j] = Integer.valueOf(v[j]).intValue();
}
}
System.err.println("最终的稀疏数组为");
for (int i = 0 ; i < sparseArr.length ; i++ ){
for (int j = 0 ; j < sparseArr[i].length ; j++ ){
System.out.printf("%d\t",sparseArr[i][j]);
}
System.out.println();
}
return sparseArr;
}
2、稀疏数组保存到磁盘
//sparseArr为稀疏数组,file为目标文件
public static void save(int[][] sparseArr,File file){
OutputStream out = null;
PrintWriter printWriter = null;
try {
out = new FileOutputStream(file);
printWriter = new PrintWriter(out);
for (int i = 0 ; i < sparseArr.length ; i ++ ){
printWriter.println(sparseArr[i][0]+ "," + sparseArr[i][1] + "," + sparseArr[i][2]);
}
}catch (IOException e){
e.printStackTrace();
} finally {
if (null != printWriter){
printWriter.close();
}
if (null != out){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3、将文件中的稀疏数组转换为原始的二维数组
//file目标文件
private static int[][] read(File file) throws IOException {
Reader reader = null;
BufferedReader bufferedReader = null;
int[][] result= new int[0][];
try {
reader = new InputStreamReader(new FileInputStream(file));
bufferedReader = new BufferedReader(reader);
String data;
String arrData = "";
while ((data = bufferedReader.readLine()) != null){
arrData += data + "|";
}
String[] strings = arrData.split("\\|");
String[] v = strings[0].split(",");
result = new int[Integer.valueOf(v[0]).intValue()][Integer.valueOf(v[1]).intValue()];
for (int i = 1 ; i < strings.length ; i ++ ){
String[] vv = strings[i].split(",");
result[Integer.valueOf(vv[0]).intValue()][Integer.valueOf(vv[1]).intValue()] = Integer.valueOf(vv[2]).intValue();
}
} catch (IOException e) {
e.printStackTrace();
} catch (NumberFormatException e) {
e.printStackTrace();
} finally {
if (null != bufferedReader){
bufferedReader.close();
}
if (null != reader){
reader.close();
}
}
return result;
}