System.arraycopy

运行以下两段代码:
代码1:
       String[][] sa1 = new String[][]{{“a11”, “a12”},{“a21”, “a22”}};
       String[][] sa2 = new String[sa1.length][sa1[0].length];
       System.arraycopy(sa1,0, sa2, 0, sa1.length);
       System.out.println(“sa1[0][0] : ” + sa1[0][0]);
       System.out.println(“sa2[0][0] : ” + sa2[0][0]);
       sa1[0][0] = “XXXXX”;
       System.out.println(“———————“);
       System.out.println(“sa1[0][0] : ” + sa1[0][0]);
       System.out.println(“sa2[0][0] : ” + sa2[0][0])
输出:
sa1[0][0] : a11
sa2[0][0] : a11
———————
sa1[0][0] : XXXXX
sa2[0][0] : XXXXX

代码2:
       String[] sa1 = new String[]{“a11”, “a12”};
       String[] sa2 = new String[sa1.length];
       System.arraycopy(sa1,0, sa2, 0, sa1.length);
       System.out.println(“sa1[0] : ” + sa1[0]);
       System.out.println(“sa2[0] : ” + sa2[0]);
       sa1[0] = “XXXXX”;
       System.out.println(“———————“);
       System.out.println(“sa1[0] : ” + sa1[0]);
       System.out.println(“sa2[0] : ” + sa2[0]);
输出:
sa1[0] : a11
sa2[0] : a11
———————
sa1[0] : XXXXX
sa2[0] : a11

可见,当数组是两维时,对源数组的改变也影响到了目标数组,但一维数组却不会有问题。要当心的。。。

行列式,矩阵,线性方程组,逆阵 java算法

行列式,矩阵,线性方程组,逆阵
package org.dean;
import javax.swing.*;
public class fun {
       private double[][]a;
       private int[][]aa;
       public fun(double[][] aa){
               a=new double[aa.length][aa[0].length];
               System.arraycopy(aa,0,a,0,aa.length);
             
       }
       public fun(int[][] a){
               aa=new int[a.length][a[0].length];
               System.arraycopy(a,0,aa,0,a.length);              
       }
   public void displayMatrix(int aa[][]){
           for(int[] df:aa){
               System.out.println();
               for(int d:df)
                       System.out.print(d+” “);}
       }
 
   public void displayMatrix(double aa[][]){
           for(double[] df:aa){
               System.out.println();
               for(double d:df)
                       System.out.print(d+” “);}
       }
       /**
        * 使用高斯消元解行列式
        * @param aa 二维double数组
        */
 public double guass(){          
         double arrangerResult=1.0;
         double k=0;
         if(a[0].length!=a.length)throw new IllegalArgumentException(“行列式的行列数必须相等”);
     for (int p = 0; p       for (int r =p+1; r        k=a[r][p]/a[p][p];
       a[r][p]=0;
       for (int c = p+1; c         a[r][c]=a[r][c]-k*a[p][c];
            }
          }
         }
     for (int i = 0; i                  arrangerResult=arrangerResult*a[i][i];//计算主对角线相乘的结果
          }
     return arrangerResult;
 }
 public int arra(){
         int c,l,sum;
         int A[];
         c=aa[0].length;
         l=aa.length;
         //第一行的代数余子式
         A=new int[c];        
         sum=0;
         //若行列数不相等
         if(c!=l) throw new IllegalArgumentException(“行列式的行数和列数必须相等”);
         //到达最小单位2*2,计算出值
         if(c==2)return aa[0][0]*aa[1][1]-aa[0][1]*aa[1][0];
         //按第一行展开,计算代数余子式
         for(int i=0;i          {   if((i)%2==0){
                 //求第一行第i个元素的代数余子式
                 A[i]=solveA(aa,0,i);}
         else{                
                 A[i]=solveA(aa,0,i)*(-1);}        
         sum+=aa[0][i]*A[i];
         }
       
         return sum;
       
       
 }
 public int arra(int aa[][]){
         int c,l,sum;
         int A[][];
         c=aa[0].length;
         l=aa.length;
         A=new int[c][l];        
         sum=0;        
         if(c!=l) throw new IllegalArgumentException(“行列式的行数和列数必须相等”);
         if(c==2)return aa[0][0]*aa[1][1]-aa[0][1]*aa[1][0];
         for(int i=0;i          {   if((i)%2==0){                
                 A[0][i]=solveA(aa,0,i);}
         else{        
                 A[0][i]=solveA(aa,0,i)*(-1);}        
         sum+=aa[0][i]*A[0][i];
         }
       
         return sum;
       
       
 }
 /**
  * 计算aa[][]第i行的j列元素的代数余子式
  * @param aa 整形数组
  * @param ii 元素的行号
  * @param jj 元素的列号
  * @return 代数余子式的行列式的值
  */
 public int solveA(int aa[][],int ii,int jj){
       //余子式元素
         int a[][];
         int c,l,m;
         int x=-1,y=0;
         c=aa[0].length-1;
         l=aa.length-1;
         //每次都按第一 行展开的余子式的行列式的值
         int A[];
         int sum=0;
         A=new int[c];
         a=new int[c][l];
         for(int i=0;i<=c;i++){
                 //如果元素的行号等于要求余子式的行号则跳过
                 if(i==ii){continue;}
                 y=0;x++;
                 for(int j=0;j<=c;j++){
            //如果元素的列号等于要求余子式的列号则跳过
                          if(j==jj){continue;
                                 }else{
                         a[x][y]=aa[i][j];                        
                         y++;}
                       
                 }}  
         if(c==2)return a[0][0]*a[1][1]-a[0][1]*a[1][0];
//  递归调用.每次都按第一行展开
         for(int i=0;i          {   if((i)%2==0)                
                 A[i]=solveA(a,0,i);
         else
                 A[i]=solveA(a,0,i)*(-1);
                 sum+=a[0][i]*A[i];
         }  
         return sum;
 }
 /**
  * 输入增广矩阵求解线性方程组解
  * @return 包含解的double数组
  */
 public double[] formula(){
         int c=aa[0].length-1;
         int r=aa.length;
         if(r!=(c)) throw new IllegalArgumentException(“必须是增广矩阵.且行数比列数少1 “);
         int D[]=new int[c];
         //A矩阵存放解
         double A[]=new double[c];        
         int a[][]=new int[r][c];
         for(int i=0;i            for(int j=0;j              a[i][j]=aa[i][j];
         //求出系数矩阵行列式的值
         int DD=arra(a);  
         for(int k=0;k            for(int i=0;i              for (int j=0;j                      a[i][j]=aa[i][j];
             }
             //第k列用最后一列替换
             a[i][k]=aa[i][c];
             }
             //求出第k列用最后一列替换以后的 行列式的值
             D[k]=arra(a);
             //求出解
             A[k]=D[k]/(double)DD;
             }
             return A;
         }
 /**
  * 求方阵的逆阵
  *
  *
  * @return 逆阵
  */
 public double[][] nizhen()
       {
       int c,l,sum;
        double A[][];
        c=aa[0].length;
       l=aa.length;
       A=new double[c][l];          
       double he=arra(aa);
       //如果只有2*2 则主对角线交换,副对角线取负即为A*
       if(c==2){
               A[0][0]=aa[1][1];
               A[1][1]=aa[0][0];
               A[1][0]=aa[0][1]*(-1);
               A[0][1]=aa[1][0]*(-1);
               //displayMatrix(A);
               return A;
       }
       for(int i=0;i          for(int j=0;j        {   if((i+j)%2==0){              
               A[j][i]=solveA(aa,i,j)/he;}
       else{              
               A[j][i]=(solveA(aa,i,j)*(-1))/he;}      
       }
       //displayMatrix(A);
       return A;
       }
}
今天重写了一次..使用了jdk5.0 的for while功能.不错.十分好用.只是递归的效率太低.高阶的几乎就是解不出来了.在想办法..

放假啦….    

历经千辛万苦总算到家啦..虽然路途很远.腿好累.但是还是免不了说一句很俗气的话.回家真好 ..
   很久没写日记,当然不是没话说了.只是静不下心来.作个年度总结吧.
   这半年也许是我学习比较用功的半年.虽然还是逃课.上课不听讲.但是总比以前进步了不少.至少数学课笔记都 记全了.就是最后算法和数据库没考好.让我一直记在心里,同学关系比较一般.班上的人都没认全噢..还是比较不外向,看来以后要努力改变一下.搞好和同学的关系..
   新的一年有好多目标噢.软件设计师要考下来,六级要考到550分,java程序员也要尽力考.数据库管理和编程要搞定.MCSE课程要学完.linux管理和编程又是不少时间.想起来头都大了噢.天天不上课也没那么多时间嘛..明年过年的时候再来看日记.看目标实现了多少噢..同学 结婚请酒.说老实话都不怎么想去,感觉我太老了噢.不过我确实是不小了.都二十好几.在过几年都奔三了 .突然感到原来我已不在年轻.有种紧迫感.

塘沽行

  来天津都三年多了,竟然没有去过塘沽,说起来经常被别人鄙视,没事老听别人说在洋货市场十几块钱买劳力士的经历,各种水货,各国的小东西,总是不禁心生向往.昨天一同学塘沽回来告诉我今天塘沽有个国际大学生龙舟邀请赛,说的可是眉飞色舞,让我觉得不去都不行了.马上打电话联系,约定好时间.
   今天起了一个大早.难得地破坏了我晚起得习惯.七点多就起床了,一醒马上打电话给他们,打开电脑,装魔兽,刷牙去,估计他们会磨点时间,让他们上车打电话给我,不料他们已经上车了.倒!手机欠了二十多了,这次真难得竟然还能打电话,去银行还交不了话费,坐上公交竟然下错了站,提前一站下了,没办法等了一辆再上,而他们已经等得开始骂娘了噢.到了中山门第一眼看到就是长长得排队得队伍,晕.怎么这么多人?打电话却联系不上人.不管了.先排上对再说.就在我放弃得时候他们打电话过来.原来他们还在外面等我.又被鄙视了一番,我只好把给他们买轻轨票当作补偿.到塘沽还要5块钱.轻轨很新,感觉和上海得差不多,不过上海得轻轨好像是卖票得,地铁才用磁卡.虽然感觉轻轨开得并不快,但是半个小时我们就到塘沽了.而以前他们坐公交要2个小时呢.
   在轻轨上看塘沽感觉塘沽还是挺大得,我以前一直以为塘沽是个很小的区,下了轻轨发现原来并不小,市区有得基本那边都有噢..一样有家世界.国美什么得,下了轻轨却没发现洋货市场在哪,先不管了.看龙舟先,上了公交感觉公交开得好猛噢.都是急开急停,站着都要拉紧了才行,有点象福州的小公交噢.人家的口号是中速行驶呢.可怜我没吃早饭,本来就没啥力气还要耗费大量体力在维持身体平衡上.
  到了外滩就感叹,人好多呀,早就听说国庆出门就是看人噢.不过还好..还可以走着游玩而不用到处挤,到了河边确发现沿河全是人,几乎都看不到河面,汗.欺负我不够高嘛…
to be continued….

我旷课了。。

今天逃了两节课,上午上的郁闷。上课几分钟就从后门逃走。下午第一次一开始就没去,以为老师上节课点的就是我们班。想想应该不会又点我们班吧。。如果全部点的话我们前面还有2个班还是来得及赶到的噢。以为宿舍到教室也就100米嘛。
  想不到。。竟然又点七班。穿着拖鞋一路狂奔过去。还是晚了。。最后记了个迟到。。倒。。上了两份钟就从后门溜了。。闷。
  今天宽带装好了。虽然学校好像不允许装,但是给人家网通钱 还是好说话嘛。昨天申请的,今天就开通了。怕别人知道大家都装,现在我们屋都锁门,进去就不出来了。有人来还要伪装一番。晕。