1.2.1 稀疏数组(二维数组)
一、应用场景
-
应用场景:当一个数组中大部分数据为同一个值时。
-
应用方法:1.记录数组中,一共有几行几列,有多少个不一样的值。
2.把有不一样值的行、列记录到一个小规模数组中。
3.这个小规模数组就是稀疏数组。
-
稀疏数组案例:
二、应用实例
数组转稀疏数组步骤
- 遍历原二维数组,得到原二维数组的行、列和有效值个数sum
- 根据sum创建稀疏数组
- 将遍历得到的值存入稀疏数组
稀疏数组转二维数组
- 读取稀疏数组的第0行,创建原始二维数组
- 读取稀疏数组后几行数据,并赋值给原二维数组
三、代码实现
- 原二维数组转稀疏数组
//创建原数组
int yuan[][] = new int[11][11];
int sunm=0;
yuan[1][2] = 1;
yuan[2][3] = 2;
yuan[3][3] = 2;
//遍历原数组
System.out.print("原数组\n");
for(int[] row:yuan){
for(int data:row){
System.out.print("\t"+data);
}
System.out.println("\n");
}
//记录原数组行、列和有效值个数
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if(yuan[i][j]!=0){
sunm++;
}
}
}
//创建稀疏数组
int xishu[][] = new int[sunm+1][3];
xishu[0][0]=11;
xishu[0][1]=11;
xishu[0][2]=sunm;
//将稀疏数组赋值
for (int i = 1; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if(yuan[i][j]!=0){
xishu[i][0]=i;
xishu[i][1]=j;
xishu[i][2]=yuan[i][j];
}
}
}
//遍历稀疏数组
System.out.println("遍历稀疏数组\n");
for(int[] row:xishu){
for(int data:row){
System.out.print("\t"+data);
}
System.out.println("\n");
}
- 将稀疏数组写入和读取文件
//将稀疏数组存入文件
FileWriter fileWriter = new FileWriter("qipan.text");//创建文件(FileWriter为字符输出流)
try {
for (int i = 0; i < xishu.length; i++) {//按行写入文件
for (int j = 0; j <3; j++) {
String s = String.valueOf(xishu[i][j])+"";//将int转为String类型
fileWriter.write(s+"\t");//写入文件,并在字符后加空格
}
fileWriter.write("\r\n");//一行写入完成后换行
}
fileWriter.close();//关闭文件
}catch (Exception e){
e.printStackTrace();
}
//将稀疏数组读取
int temp[][] = new int[11][11];//创建缓存空间
BufferedReader bufferedReader = null;//字符缓冲区
try {
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(new File("qipan.text")));//InputStreamReader为字节输入流;FileInputStream为读取文件
bufferedReader = new BufferedReader(inputStreamReader);//将读取到的数据存放在缓冲区
String lien = null;
int i = 0;
while((lien = bufferedReader.readLine())!=null){//判断读取长度是否为空
if(null!=lien){
String[] split = lien.split("\\t");//按空格将值存入
for (int j = 0; j <split.length; j++) {
temp[i][j] = Integer.valueOf(split[j]);
}
i++;
}
}
}catch (Exception e){
e.printStackTrace();
}
- 将稀疏数组转原二维数组
//创建新数组并将稀疏数组的值赋进去
int[][] yuan1 = new int[temp[0][0]][temp[0][1]];
for (int i = 1; i < temp[0][2]; i++) {
int row = temp[i][0];
int low = temp[i][1];
int val = temp[i][2];
yuan1[row][low] = val;
}
//遍历新数组
System.out.println("遍历新数组");
for(int[] row:yuan1){
for(int data:row){
System.out.print("\t"+data);
}
System.out.println("\n");
}
四、疑点、难点、需要补充知识(I/O流)
-
文件I/O
创建的几个类:1.InputrStream / FileInputrStream (读文件)
2**.OutputStream / FileOutputStream (写文件)**
1.1数据的写入和读取
数据写入:InputrStream / FileInputrStream (读文件:如果文件不存在就新创建,存在则清除然后再创建)
//1.写入文件
byte[] data = {0,1,2,3,4,5,6,7,8,9,10};//要存入的数据
OutputStream outputStream = new FileOutputStream("twst.text");//创建文件
outputStream.write(data,0,8);//写入文件
outputStream.close();//关闭文件
数据读取:OutputStream / FileOutputStream (写文件)
//2.读取文件
byte[] buffer = new byte[10000];//创建缓存区
InputStream inputStream = new FileInputStream("twst.text");//获取文件
int n = inputStream.read(buffer,0,1000);//读取字节数
inputStream.close();//关闭文件
1.2文本的写入和读取
重点:使用String自带方法将byte转为String类型
代码: String st = new String(redstr,0,read,“UTF-8”);//将读取到的文件转为Sring类型
文本写入:
//写入
String str = "谢鑫你好";//需要储存的文本文件
byte[] bytes = str.getBytes("UTF-8");//将字符串转为byte数组
OutputStream outputStream1 = new FileOutputStream("twst1.text");//创建文件
outputStream1.write(bytes);//写入文件
outputStream1.close();//关闭文件
文本读取:
//读取
byte[] redstr = new byte[1000];//创建缓存区
InputStream inputStream1 = new FileInputStream("twst1.text");//获取文件
int read = inputStream1.read(redstr);//读取文件字节数
String st = new String(redstr,0,read,"UTF-8");//将读取到的文件转为Sring类型
inputStream1.close();//关闭文件