执行代码:
public static void main(String[] args) throws Exception {
jp.initData(new DebugInfoJava());
//创建三维数组
NDimensionalArray_ nda = new NDimensionalArray_(2,3,5);
//给三维数组赋值
for(int i= 0; i<2;i++) {
for(int j= 0; j < 3; j++) {
for(int k =0; k < 5; k++){
nda.setValue("i=" + i + ",j=" + j + ",k=" + k, i,j,k);
}
}
}
jp.p("以下是三维数据元素值");
//读取三维数组的值
for(int i= 0; i< 2; i++) {
for(int j= 0; j < 3; j++) {
for(int k =0; k < 5; k++){
jp.p(nda.getValue(i,j,k).toString());
}
}
}
}
结果:
/***************************************************************************
* 文件名 : NDimensionalArray.java
* 包名 :JavaPlatform
* 作用 : N维数组操作
* 作者 : 李锋
* Email : ruizhilf@139.com
* 手机 :13828778863
* 创建日期 : 2022年9月14日 最后一次修改日期:2022年9月14日
***************************************************************************/
package JavaPlatform;
import JavaPlatform.System.DebugInfoJava;
public class NDimensionalArray_ {
/**
* 最大元数个数10亿
*/
public final int MaxElementCount = 1000000000;
/**
* 保存元素的一维数组,任何维度数组都可以用一维数组表示。
*/
private Object[] m_DataArray = null ;
/**
* 维度信息,数组长度就是维度数,数组中的值就是维度长度。
*/
private int[] m_DimensionMax = null;
public NDimensionalArray_(int... DimensionaArgs) throws Exception{
m_DimensionMax = DimensionaArgs;
if(m_DimensionMax == null) {
throw new java.lang.NullPointerException();
}
int nLength = 1;
for(int i = 0; i < DimensionaArgs.length; ++i) {
if( DimensionaArgs[i] <= 0) {
throw new Exception("错误,维度长度不能小于等于0!");
}
nLength *= DimensionaArgs[i];
}
if( nLength > MaxElementCount) {
throw new Exception("错误,维度元素个数大于最大元素个数 " + MaxElementCount + "!");
}
m_DataArray = new Object[nLength];
}
/**
* 功能: 返回维度长度
* @return
* @return int
* @since 创建日期:2022年9月14日,最后一次修改日期:2022年9月14日
* @author 李锋
*/
public int getDimensionLegnth() {
return m_DimensionMax.length;
}
/**
* 功能: 返回某一维度的长度
* @param N
* @return
* @return int
* @since 创建日期:2022年9月14日,最后一次修改日期:2022年9月14日
* @author 李锋
* @throws Exception
*/
public int getDimensionLength(int N) throws Exception{
if( N - 1 >= this.m_DataArray.length || N - 1 <= 0) {
throw new Exception(new java.lang.ArrayIndexOutOfBoundsException());
}
return m_DimensionMax[N -1];
}
/**
* 功能: 获取用一维数组表示的任意N维数组的定位
* @param argiDimensionValue
* @return void
* @since 创建日期:2022年9月14日,最后一次修改日期:2022年9月14日
* @author 李锋
*/
public int getPsition(int... dimensionValueArgi)
{
/*
三维数组 a[3][2][5] => 用一维数字 m_DataArray[3*2*5] 表示。
假设三维数组 a[3][2][5] 3行2列5面数组 用 a[x_max][y_max][z_max] 代替,
那么 x_max = 3, y_max = 2, z_max = 5,那么
数组 m_DimensionMax = {x_max,y_max,z_max}
即:
dimensionValueArgi[0] = x_max = 3
dimensionValueArgi[1] = y_max = 2
dimensionValueArgi[1] = z_max = 5
所有元素可以看作 三个数列相加,数列名为 a[0],a[1],a[2]
a[0] 总数 10个
a[1] 总数 10个
a[2] 总数 10个
例子:getFixedPsition(0,1,2) x,y,z
第一列第一个无素是: a[0][0][0] => (y+1) * (z+1) => m_DataArray[ (x * y_max * z_max) + (y+1) * (z+1) - 1] => m_DataArray[0]
第二列第一个元素是: a[1][0][0] => m_DataArray[ (x * y_max * z_max) + (y+1) * (z+1) - 1]
=> a[ ( 1 * 2 * 5) + (0+1) * (0+1) ] => m_DataArray[10];
第二列第二个元素是: a[1][1][0] => m_DataArray[ ( x * y_max * z_max) + (y+1) * (z+1) - 1]
=> a[ ( 1 * 2 * 5) + (1+1) * (0+1) - 1] => m_DataArray[11];
最后:
a[x][y][z] => m_DataArray[ (x * y_max * z_max) + (y+1) * (z+1) - 1]
=> m_DataArray[ (dimensionValueArgi[0] * y_max * z_max) + ( dimensionValueArgi[1] + 1) * (dimensionValueArgi[2] + 1) - 1]
*/
//时间问题,太晚了,这一版本暂时不进行异常处理
int i数列总数 = 1;
for(int i = 1; i < m_DimensionMax.length; ++i) {
i数列总数 *= m_DimensionMax[i];
}
int sum1 = dimensionValueArgi[0] * i数列总数;
int sum2 = 1;
for(int i = 1; i < dimensionValueArgi.length; ++i) {
sum2 *= (1 + dimensionValueArgi[i]);
}
return sum1 + sum2 - 1;
}
/**
* 功能: 描述
* @param value
* @param dimensionValueArgi
* @return void
* @since 创建日期:2022年9月14日,最后一次修改日期:2022年9月14日
* @author 李锋
*/
public void setValue(Object value,int... dimensionValueArgi) {
//时间问题,太晚了,这一版本暂时不进行异常处理
m_DataArray[getPsition(dimensionValueArgi)] = value;
}
/**
* 功能: 描述
* @param dimensionValueArgi
* @return
* @return Object
* @since 创建日期:2022年9月14日,最后一次修改日期:2022年9月14日
* @author 李锋
*/
public Object getValue(int... dimensionValueArgi) {
return m_DataArray[getPsition(dimensionValueArgi)];
}
public static void main(String[] args) throws Exception {
jp.initData(new DebugInfoJava());
//创建一维数组
NDimensionalArray_ nda = new NDimensionalArray_(2);
//给一维数组赋值
for(int i= 0; i<2;i++) {
nda.setValue("i=" + i, i);
}
jp.p("以下是一维数据元素值");
//读取二维数组的值
for(int i= 0; i< 2; i++) {
jp.p(nda.getValue(i).toString());
}
//创建二维数组
nda = new NDimensionalArray_(2,3);
//给二维数组赋值
for(int i= 0; i<2;i++) {
for(int j= 0; j < 3; j++) {
nda.setValue("i=" + i + ",j=" + j, i,j);
}
}
jp.p("以下是二维数据元素值");
//读取二维数组的值
for(int i= 0; i< 2; i++) {
for(int j= 0; j < 3; j++) {
jp.p(nda.getValue(i,j).toString());
}
}
//创建三维数组
nda = new NDimensionalArray_(2,3,5);
//给三维数组赋值
for(int i= 0; i<2;i++) {
for(int j= 0; j < 3; j++) {
for(int k =0; k < 5; k++){
nda.setValue("i=" + i + ",j=" + j + ",k=" + k, i,j,k);
}
}
}
jp.p("以下是三维数据元素值");
//读取三维数组的值
for(int i= 0; i< 2; i++) {
for(int j= 0; j < 3; j++) {
for(int k =0; k < 5; k++){
jp.p(nda.getValue(i,j,k).toString());
}
}
}
}
}