运行结果:
关键函数getCoordinateForIndex:
/**
* 功能: 根据一维数组的索引,获取N维数组的坐标。
* @param nIndex
* @return
* @return int[]
* @since 创建日期:2022年9月17日,最后一次修改日期:2022年9月17日
* @author 李锋
*/
public int[] getCoordinateForIndex(int nIndex) {
int[] iResultArray = new int[m_DimensionMax.length];
int tmp = nIndex;
for(int i = 0; i< m_DimensionMax.length; ++i) {
int sum = 1;
for(int j = i+1; j < m_DimensionMax.length; ++j) {
sum *= m_DimensionMax[j];
}
iResultArray[i] = tmp / sum;
tmp = tmp - sum * iResultArray[i];
}
return iResultArray;
}
/**
* 功能: 维度数组转置
* If A is the mxn matrix, then the nxm matrix is called the transpose of A.
* 如果A是mxn矩阵, 那么nxm矩阵为A的转置矩阵.
* @return
* @since 创建日期:2022-09-16,最后一次修改日期:2022-09-16
* @author 李锋
* @throws Exception
*/
public void transposition() throws Exception {
/*
二维数组:
8,4,5,7
9,3,9,9
1,6,4,6
转置后应该是:
8,9,1
4,3,6
5,9,4,
7,9,6
//二维
NDimensionalArray_ tmp = new NDimensionalArray_(Math_.copyReverseArray(m_DimensionMax));
if(m_DimensionMax.length == 2) {
for(int i = 0; i< m_DimensionMax[0]; ++i) {
for(int j = 0; j < m_DimensionMax[1]; ++j) {
tmp.setValue(getValue(i,j),j,i);
}
}
m_DataArray = tmp.m_DataArray;
m_DimensionMax = tmp.m_DimensionMax;
}
*/
//N维呢?探索中
//可以推导出
NDimensionalArray_ tmp = new NDimensionalArray_(Math_.copyReverseArray(m_DimensionMax));
for(int i = 0; i< this.m_DataArray.length; ++i) {
Object value = m_DataArray[i];
int[] Coordinat = getCoordinateForIndex(i);
tmp.setValue(value,Math_.copyReverseArray(Coordinat));
}
m_DataArray = tmp.m_DataArray;
m_DimensionMax = tmp.m_DimensionMax;
}
NDimensionalArray类
/***************************************************************************
* 文件名 : NDimensionalArray.java
* 包名 :JavaPlatform
* 作用 : N维数组操作
* 作者 : 李锋
* Email : ruizhilf@139.com
* 手机 :13828778863
* 创建日期 : 2022年9月14日 最后一次修改日期:2022年9月14日
***************************************************************************/
package JavaPlatform.System;
import JavaPlatform.jp;
public class NDimensionalArray_ {
/**
* 最大元数个数10亿
*/
public final int MaxElementCount = 1000000000;
/**
* 保存元素的一维数组,任何维度数组都可以用一维数组表示。
*/
private Object[] m_DataArray = null ;
/**
* 功能: 返回数组指针,并不是一个copy
* @return
* @return Object[]
* @since 创建日期:2022年9月17日,最后一次修改日期:2022年9月17日
*/
public Object[] getDataArray() {
return m_DataArray;
}
/**
* 维度信息,数组长度就是维度数,数组中的值就是维度长度。
*/
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 dimensionValueArgi
* @return void
* @since 创建日期:2022年9月14日,最后一次修改日期:2022年9月15日
* @author 李锋
*/
public int getPsition(int... dimensionValueArgs)
{
/*
三维数组 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];
错误: 计算结果是:m_DataArray[11],正确是 m_DataArray[16] = 11 + 5
最后:
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;
*/
int sum = 0;
for(int i = dimensionValueArgs.length - 1; i >= 0; --i) {
int n = 1;
for(int j = i + 1; j < m_DimensionMax.length; j++)
{
n *= m_DimensionMax[j];
}
sum += n * dimensionValueArgs[i];
}
return sum;
}
/**
* 功能: 根据一维数组的索引,获取N维数组的坐标。
* @param nIndex
* @return
* @return int[]
* @since 创建日期:2022年9月17日,最后一次修改日期:2022年9月17日
* @author 李锋
*/
public int[] getCoordinateForIndex(int nIndex) {
int[] iResultArray = new int[m_DimensionMax.length];
int tmp = nIndex;
for(int i = 0; i< m_DimensionMax.length; ++i) {
int sum = 1;
for(int j = i+1; j < m_DimensionMax.length; ++j) {
sum *= m_DimensionMax[j];
}
iResultArray[i] = tmp / sum;
tmp = tmp - sum * iResultArray[i];
}
return iResultArray;
}
/**
* 功能: 描述
* @param value
* @param dimensionValueArgi
* @return void
* @since 创建日期:2022年9月14日,最后一次修改日期:2022年9月14日
* @author 李锋
*/
public void setValue(Object value,int... dimensionValueArgi) {
//jp.p("getPsition(dimensionValueArgi)=" + getPsition(dimensionValueArgi) + "x=" + dimensionValueArgi[1] + ",y=" +
// dimensionValueArgi[2]);
//时间问题,太晚了,这一版本暂时不进行异常处理
m_DataArray[getPsition(dimensionValueArgi)] = value;
}
/**
* 功能: 在区间[iMin,iMax]中的随机整数
* @param iMin
* @param iMax
* @return void
* @since 创建日期:2022年9月17日,最后一次修改日期:2022年9月17日
*/
public void setRandomInt(int iMin,int iMax) {
for(int i = 0; i < m_DataArray.length; ++i) {
m_DataArray[i] = jp.getRandomInt(iMin, iMax);
}
}
/**
* 功能: 随机大小字母
* @return void
* @since 创建日期:2022年9月17日,最后一次修改日期:2022年9月17日
*/
public void setRandomChar() {
for(int i = 0; i < m_DataArray.length; ++i) {
m_DataArray[i] = (char) jp.getRandomInt(65, 90);;
}
}
/**
* 功能: 描述
* @param dimensionValueArgi
* @return
* @return Object
* @since 创建日期:2022年9月14日,最后一次修改日期:2022年9月14日
* @author 李锋
*/
public Object getValue(int... dimensionValueArgi) {
return m_DataArray[getPsition(dimensionValueArgi)];
}
/**
* 功能: 维度数组转置
* If A is the mxn matrix, then the nxm matrix is called the transpose of A.
* 如果A是mxn矩阵, 那么nxm矩阵为A的转置矩阵.
* @return
* @since 创建日期:2022-09-16,最后一次修改日期:2022-09-16
* @author 李锋
* @throws Exception
*/
public void transposition() throws Exception {
/*
二维数组:
8,4,5,7
9,3,9,9
1,6,4,6
转置后应该是:
8,9,1
4,3,6
5,9,4,
7,9,6
//二维
NDimensionalArray_ tmp = new NDimensionalArray_(Math_.copyReverseArray(m_DimensionMax));
if(m_DimensionMax.length == 2) {
for(int i = 0; i< m_DimensionMax[0]; ++i) {
for(int j = 0; j < m_DimensionMax[1]; ++j) {
tmp.setValue(getValue(i,j),j,i);
}
}
m_DataArray = tmp.m_DataArray;
m_DimensionMax = tmp.m_DimensionMax;
}
*/
//N维呢?探索中
//可以推导出
NDimensionalArray_ tmp = new NDimensionalArray_(Math_.copyReverseArray(m_DimensionMax));
for(int i = 0; i< this.m_DataArray.length; ++i) {
Object value = m_DataArray[i];
int[] Coordinat = getCoordinateForIndex(i);
tmp.setValue(value,Math_.copyReverseArray(Coordinat));
}
m_DataArray = tmp.m_DataArray;
m_DimensionMax = tmp.m_DimensionMax;
}
/**
* 功能: 描述
* @return
* @since 创建日期:2022-09-16,最后一次修改日期:2022-09-16
* @author 李锋
*/
@Override
public String toString() {
int nLen = m_DimensionMax.length;
if(nLen == 0){
return "";
}
else if(nLen == 1){
return jp.arrayToString(m_DataArray,",",10);
}
else{
return jp.arrayToString(m_DataArray,",",m_DimensionMax[1] );
}
}
public static void main(String[] args) throws Exception {
jp.initData(new DebugInfoJava());
}
}