1. 어레이 개념
배열은 저장 공간이 연속적인 데이터 구조입니다. 따라서 배열은 요소를 제거하기가 복잡하고 요소를 쿼리하는 데 매우 빠릅니다. 삭제 논리는 기본적으로 재정의입니다.
동시에 배열은 동일한 데이터 유형의 요소만 저장할 수 있는 가장 단순한 컨테이너이기도 하며 배열의 용량이 결정되면 변경할 수 없습니다.
배열은 1차원 배열과 다차원 배열로 나눌 수 있습니다. 일반적으로 행렬은 2차원 배열입니다.
배열을 선언하는 방법:
int[] arr = new int{
1,2,3};
String[] arr = new String[3][3];
int[] arr = {
1,2,3};
배열 초기화 방법에는 정적 초기화와 동적 초기화가 있습니다.
2. 자바의 배열
java.util.Arrays
클래스는 배열을 쉽게 조작할 수 있으며 제공하는 모든 메서드는 정적입니다.
일반적인 작업에는 다음이 포함됩니다.
- 채우기 방법을 통해 배열에 값을 할당합니다.
- 배열 정렬: 정렬 방법에 따라 오름차순으로 정렬합니다.
- 배열 비교: equals 메서드를 통해 배열의 요소가 동일한지 비교합니다.
- 배열 요소 찾기: 이진 검색 방법은 정렬된 배열에서 이진 검색 작업을 수행하는 데 사용할 수 있습니다.
3. 희소 배열
희소 배열, 즉 배열에 0 값(또는 동일한 값)이 많을 때 배열을 직접 저장하면 공간이 낭비되고 특정 압축 전략을 사용해야 하며 압축 후 손실 없이 복원할 수 있습니다. .
이 때의 상황은 대부분의 체스판이 비어 있는 상태인데, 기본값은 0인데, 최대한 공간을 절약하기 위해 어떻게 보관해야 할까요?
희소 배열을 위한 구성 전략:
1. 순회하고 배열에 얼마나 많은 행과 열이 있는지, 얼마나 많은 다른 값이 있는지 기록하십시오. n;
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();
}
}
}