一维数组
1)声明: 类型 []变量名 或 类型 变量名[]
int [] a 或 int a[];
注意声明数组时不要规定数组的长度,长度在初始化即分配空间时给定
2)初始化:
数组是一个对象,用new分配空间
静态初始化 int [] a = {1,2,4};
动态初始化 int [] a = new int[n] 或 int a[] = new int[n]
这里的n可以是一个变量,在声明数组之前声明n的大小即可
初始化时可以不声明大小,可以直接给定数组元素的值
int [] a = new int[]{1,2,4};
但不可在声明大小的同时赋值
int [] a = new int[3]{1,2,4};
注意数组大小是不可变的,一旦声明不可改变大小
看一个例子:
int[] a = new int[2]; a = new int[3];
编译运行都正常,看起来像是重新定义了数组的大小,验证一下
int a[] = new int[2]; a[0] = 1; a[1] = 2; a = new int[3]; System.out.println(a[0] + " " + a[1]);
输出是0 0,说明数组a已经不是原来的a了,这里相当于重新创建一个大小为3的数组
3)访问
单个元素使用下标访问:a[0]
遍历可用for循环或foreach。
二维数组
实际上Java并不支持二维数组,Java的二维数组实质上是在一维数组的每一个元素上再定义一个一维数组,是数组的数组。
1)声明:同一维数组, 类型 [][]变量名 或 类型 变量名[][]
int []][]a 或 int a[][];
2)初始化
静态初始化:int [][]a = {{1,2,3},{4,5,6},{7,8,9}};等同于int [][]a = new int [][] {{1,2,3},{4,5,6},{7,8,9}};
动态初始化:int [][]a = new int[m][n];或int [][]a = new int[m][];
第二维可空,可变化,但第一维不行,错误示例:int [][]a = new int[][n]
3)访问
单个元素使用下标访问:a[0][1]
遍历使用嵌套for循环
for(int i = 0; i < a.length; i++) {
for(int j = 0; j < a[i].length; j++) {
System.out.print(a[i][j]);
}
System.out.println();
}
也可以嵌套foreach
for(int []col:a) {
for(int row:col) {
System.out.print(row + " ");
}
System.out.println();
}
下面附上一个比较全面的练习题:
利用二维数组(double[])实现一个矩阵类:Matrix。要求提供以下方法:(1)set(int row, int col, double value):将第row行第col列的元素赋值为value;(2)get(int row,int col):取第row行第col列的元素;(3)width():返回矩阵的列数;(4)height():返回矩阵的行数;(5)Matrix add(Matrix b):返回当前矩阵与矩阵b相加后的矩阵;(6)Matrix multiply(Matrix b):返回当前矩阵与矩阵b相乘后的矩阵。(7)Matrix transpose():返回当前矩阵的转置矩阵;(8)toString():以行和列的形式打印出当前矩阵。
输入格式:
矩阵的行列数 矩阵的数据 设置矩阵值的行、列和值 获取矩阵值的行、列 待相加矩阵的行列数 待相加矩阵的值 待相乘矩阵的行列数 待相乘矩阵的值
输出格式:
矩阵的行、列数 设置矩阵值后的矩阵 某行某列的矩阵值 矩阵相加结果 矩阵相乘结果 矩阵转置结果
输入样例:
在这里给出一组输入。例如:
3 3 1 2 3 4 5 6 7 8 9 2 3 8 1 3 3 3 1 2 3 4 5 6 7 8 9 3 2 1 2 1 2 1 2
输出样例:
在这里给出相应的输出。例如:
row:3 column:3 after set value: 1 2 3 4 5 8 7 8 9 value on (1,3):3 after add: 2 4 6 8 10 14 14 16 18 after multiply: 6 12 17 34 24 48 after transpose: 1 4 7 2 5 8 3 8 9
import java.util.*;
import java.text.DecimalFormat;
public class Main{
public static void main(String args[]) {
Scanner cin = new Scanner(System.in);
DecimalFormat df = new DecimalFormat("0");
int row = cin.nextInt();
int col = cin.nextInt();
double [][]mat = new double[row][col];
for(int i = 0; i < row; i++)
{
for(int j = 0; j < col; j++)
{
mat[i][j] = cin.nextDouble();
}
}
Matrix m = new Matrix(row, col, mat);
System.out.println("row:" + row + " column:" + col);
//set
System.out.println("after set value:");
m.set(cin.nextInt(), cin.nextInt(), cin.nextDouble());
System.out.print(m);
//get
int getr = cin.nextInt();
int getc = cin.nextInt();
System.out.println("value on (" + getr + "," + getc + "):" + df.format(m.get(getr, getc)));
//add
int addr = cin.nextInt();
int addc = cin.nextInt();
double [][]addmat = new double[addr][addc];
for(int i = 0; i < addr; i++)
{
for(int j = 0; j < addc; j++)
{
addmat[i][j] = cin.nextDouble();
}
}
Matrix addm = new Matrix(addr, addc, addmat);
System.out.println("after add:");
System.out.print(m.add(addm));
//mul
int mulr = cin.nextInt();
int mulc = cin.nextInt();
double [][]mulmat = new double[mulr][mulc];
for(int i = 0; i < mulr; i++)
{
for(int j = 0; j < mulc; j++)
{
mulmat[i][j] = cin.nextDouble();
}
}
Matrix mulm = new Matrix(mulr, mulc, mulmat);
System.out.println("after multiply:");
System.out.print(m.multiply(mulm));
//tran
System.out.println("after transpose:");
System.out.print(m.transpose());
}
}
class Matrix {
public double [][]mat;
private int row;
private int col;
protected Matrix(int row, int col, double [][]m) {
this.row = row;
this.col = col;
double [][]mat = new double[row][];
for(int i = 0; i < row; i++)
mat[i] = new double[col];
this.mat = m;
}
protected void set(int row, int col, double value) {
mat[row - 1][col - 1] = value;
}
protected double get(int row, int col) {
return mat[row - 1][col - 1];
}
protected int width() {
return col;
}
protected int height() {
return row;
}
protected Matrix add(Matrix b) {
double [][]ad = new double[row][col];
for(int i = 0; i < this.row; i++)
for(int j = 0; j < this.col; j++)
ad[i][j] = this.mat[i][j] + b.mat[i][j];
Matrix a = new Matrix(this.row, this.col, ad);
return a;
}
protected Matrix multiply(Matrix b) {
if(this.width() == b.height())
{
double [][]mul = new double[this.height()][b.width()];
for(int i = 0; i < this.height(); i++)
{
for(int j = 0; j < b.width(); j++)
{
double s = 0;
for(int k = 0; k < this.width(); k++)
{
s += this.mat[i][k] * b.mat[k][j];
}
mul[i][j] = s;
}
}
Matrix m = new Matrix(this.height(), b.width(), mul);
return m;
}
return null;
}
protected Matrix transpose() {
double[][]tran = new double[this.width()][this.height()];
for(int i = 0; i < this.height(); i++)
for(int j = 0; j < this.width(); j++)
tran[j][i] = this.mat[i][j];
Matrix t = new Matrix(this.width(), this.height(), tran);
return t;
}
public String toString() {
DecimalFormat df = new DecimalFormat("0");
String s = "";
for(int i = 0; i < this.height(); i++)
{
s += df.format(this.mat[i][0]);
for(int j = 1; j < this.width(); j++)
s += " " + df.format(this.mat[i][j]);
s += "\n";
}
return s;
}
}