1.アレイの概念
配列は、ストレージスペースが隣接しているデータ構造です。したがって、配列は要素を削除するのが複雑で、要素のクエリを非常に高速に実行します。削除のロジックは本質的にオーバーライドであることに注意してください。
同時に、配列は最も単純なコンテナでもあり、同じデータ型の要素のみを格納できます。配列の容量が決定されると、それを変更することはできません。
配列は、1次元配列と多次元配列に分けることができます。一般的に、行列は2次元配列です。
配列を宣言する方法:
int[] arr = new int{
1,2,3};
String[] arr = new String[3][3];
int[] arr = {
1,2,3};
アレイの初期化方法には、静的初期化と動的初期化が含まれます。
2.Javaの配列
java.util.Arrays
クラスは配列を簡単に操作でき、クラスが提供するすべてのメソッドは静的です。
一般的な操作は次のとおりです。
- 配列に値を割り当てます:fillメソッドを使用します。
- 配列を並べ替えます:sortメソッドで昇順で並べ替えます。
- 配列の比較:equalsメソッドを使用して、配列内の要素が等しいかどうかを比較します。
- 配列要素の検索:バイナリ検索メソッドを使用して、並べ替えられた配列に対してバイナリ検索操作を実行できます。
3.スパース配列
スパース配列、つまり、配列にゼロ値(または同じ値)が多数ある場合、配列を直接格納するとスペースが無駄になり、特定の圧縮戦略を使用する必要があり、圧縮後にロスレスで復元できます。
現時点での状況は、ほとんどのチェス盤が空であり、これがデフォルト値の0です。では、スペースをできるだけ節約するために、どのようにチェス盤を保管するのでしょうか。
スパース配列の構築戦略:
1.トラバースしてから、配列に含まれる行と列の数、および異なる値の数を記録します。
2.(n + 1,3)2次元配列ストレージを作成します。このストレージでは、最初の行に要素の順序と要素番号の情報が記録され、他の行には対応する位置要素の情報が記録されます。
4.スパース配列を使用してチェッカーボード圧縮ストレージを実装します
ケース:3 * 3のチェス盤データは圧縮されてスパース配列に格納され、元の配列に復元できます。(この例はあまり適切ではないため、保存する操作がより複雑になります。明らかに、要素の数が次数よりも多い場合は、行列の圧縮にスパース行列を使用する方が適切です。)
package com.lsk.array;
import java.io.*;
public class SparseArray {
public static void main(String[] args) throws IOException {
int[][] arr = new int[3][3];
arr[0][0] = 1;
arr[1][1] = 2;
arr[1][2] = 3;
arr[2][1] = 5;
System.out.println("原始数组为:");
printArr(arr);
int[][] spareArray = spareArray(arr);
System.out.println("压缩的稀疏数组为:");
printArr(spareArray);
saveToDisk(spareArray);
int[][] orignArr = unSparseArr(spareArray);
System.out.println("稀疏数组还原为原始数组:");
printArr(orignArr);
}
/**
* 压缩稀疏数组实现方法
*
* @param arr 原始数组
* @return 稀疏数组
*/
public static int[][] spareArray(int arr[][]) {
//计算原始数组非0元素个数
int sum = 0;
int row = arr.length;
int column = arr[0].length;
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
if (arr[i][j] != 0) {
sum++;
}
}
}
int sparseArr[][] = new int[sum + 1][3];
sparseArr[0][0] = row;
sparseArr[0][1] = column;
sparseArr[0][2] = sum;
int count = 0;//记录不同值得序号
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
if (arr[i][j] != 0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = arr[i][j];
}
}
}
return sparseArr;
}
/**
* 根据稀疏数组还原为原始数组
*
* @param arr
* @return
*/
public static int[][] unSparseArr(int arr[][]) {
int row = arr[0][0];
int column = arr[0][1];
int sum = arr[0][2];
int orignArr[][] = new int[row][column];
for (int i = 1; i < sum + 1; i++) {
orignArr[arr[i][0]][arr[i][1]] = arr[i][2];
}
return orignArr;
}
/**
* 将数组写入到磁盘中
* @param arr
* @throws IOException
*/
public static void saveToDisk(int arr[][]) throws IOException {
File file = new File("d:/temp/arr.txt");
if(!file.exists()){
file.createNewFile();
}
//创建字符写入流对象
FileOutputStream fo = new FileOutputStream(file);
OutputStreamWriter writer = new OutputStreamWriter(fo, "utf8");
BufferedWriter bufferedWriter = new BufferedWriter(writer);
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[0].length;j++){
bufferedWriter.write(arr[i][j]+"\t");//注意这里需用字符的形式写入,不然会乱码
}
bufferedWriter.write("\r\n");
}
bufferedWriter.close();
writer.close();
fo.close();
System.out.println("保存成功!");
}
/**
* 打印二维数组方法
*
* @param arrs
*/
public static void printArr(int arrs[][]) {
for (int[] arr : arrs) {
for (int a : arr) {
System.out.print(a + " ");
}
System.out.println();
}
}
}