Java创建N维数组类(版本0.2)

发布于:2022-12-17 ⋅ 阅读:(231) ⋅ 点赞:(0)

纠正:

 

       int sum  = 0;
        for(int i = dimensionValueArgi.length - 1; i >= 0; --i) {
            int n = 1;
            for(int j = i + 1; j < m_DimensionMax.length; j++)
            {
                n *= m_DimensionMax[j];
            }
            sum += n * dimensionValueArgi[i];
        }        
        return sum;

/***************************************************************************  
 * 文件名        : NDimensionalArray.java   
 * 包名            :JavaPlatform   
 * 作用          : N维数组操作   
 * 作者            : 李锋   
 * Email        : ruizhilf@139.com
 * 手机           :13828778863
 * 创建日期        : 2022年9月14日            最后一次修改日期:2022年9月15日  

 ***************************************************************************/
package JavaPlatform;

import java.lang.reflect.Array;

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;        
        */
        
        int sum  = 0;
        for(int i = dimensionValueArgi.length - 1; i >= 0; --i) {
            int n = 1;
            for(int j = i + 1; j < m_DimensionMax.length; j++)
            {
                n *= m_DimensionMax[j];
            }
            sum += n * dimensionValueArgi[i];
        }        
        return sum;

    }
    
    
    /**
     * 功能: 描述
     * @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;
        
    }
    
    
    /**
     * 功能: 描述
     * @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,3,5,7);
        //给三维数组赋值
        for(int i= 0; i<2;i++) {
            for(int j= 0; j < 3; j++) {
                for(int k =0; k < 5; k++){
                    for(int l =0; l < 7; l++)
                    {
                        //nda.setValue(jp.getRandomInt(1,100) ,i,j,k,l);
                    
                    }
                }
            }
        }
         
  
        //创建三维数组
        nda = new NDimensionalArray_(3,2,5);
        //给三维数组赋值
        for(int i= 0; i<3;i++) {
            for(int j= 0; j < 2; j++) {

                for(int k =0; k < 5; k++){
                
                        nda.setValue(jp.getRandomInt(1,100) ,i,j,k);
                }
            
                }
             
        }
         
         
        
         
        //查找80
        
        for(int i = 0; i < nda.m_DataArray.length; ++i)
        {
            Object o = nda.m_DataArray[i];
            
            if( o == null)
              jp.p("null");
            else
                jp.p(o.toString());
             
        }
       
        
     
        
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到