N维数组转置函数(已完成)

运行结果:

 关键函数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());         
            
    }


}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值