码迷,mamicode.com
首页 > 其他好文 > 详细

矩阵的加、减、乘、除、toString、equals、hashCode、clone

时间:2018-02-07 22:58:29      阅读:317      评论:0      收藏:0      [点我收藏+]

标签:不为   obj   oid   package   rgs   返回结果   for   4.0   jdk   

  1 package com.jdk7.chapter4;
  2 
  3 import java.text.DecimalFormat;
  4 import java.util.Arrays;
  5 
  6 /**
  7  * 数组的加减乘除
  8  * @author Administrator
  9  *
 10  */
 11 
 12 public class MatrixData implements Cloneable{
 13     //声明一个私有double类型的二维数组存放数据,私有变量只能在该类中使用,不能被外部调用
 14     private double[][] matrixData;
 15     
 16     //无参构造函数
 17     public MatrixData(){
 18         //用默认值进行初始化
 19         this.init();
 20     }
 21     
 22     //带参构造函数
 23     public MatrixData(double[][] b){
 24         //二维数组b为空则调用默认值进行初始化
 25         if(!arraySameLength(b)){
 26             System.out.println("数组第二维长度不等");
 27             this.init();
 28         }else{        //二维数组b不为空,则将b克隆
 29             System.out.println("数组第二维长度都相等");
 30             this.matrixData = b;
 31         }
 32     }
 33     
 34     public MatrixData add(MatrixData data){
 35         if(data==null){return null;}
 36         
 37         double[][] datab = data.getMatrixData();
 38         MatrixData c = null;
 39         if(!sameLength(data)){
 40             return c;
 41         }else{
 42             double[][] datac = new double[this.matrixData.length][this.matrixData[0].length];
 43             for(int i=0;i<this.matrixData.length;i++){
 44                 for(int j=0;j<this.matrixData[0].length;j++){
 45                     datac[i][j] = this.matrixData[i][j] + data.matrixData[i][j];
 46                 }
 47             }
 48             c = new MatrixData(datac);
 49             return c;
 50         }
 51     }
 52     
 53     public MatrixData sub(MatrixData b){
 54         if(b==null){return null;}
 55         double[][] datab = b.getMatrixData();
 56         MatrixData c = null;
 57         if(sameLength(b)){
 58             double[][] datac = new double[this.matrixData.length][this.matrixData[0].length];
 59             for(int i=0;i<this.matrixData.length;i++){
 60                 for(int j=0;j<this.matrixData[0].length;j++){
 61                     datac[i][j] = this.matrixData[i][j] - datab[i][j];
 62                 }
 63             }
 64             c = new MatrixData(datac);
 65             return c;
 66         }else{
 67             return c;
 68         }
 69     }
 70     
 71     public MatrixData multiply(MatrixData data){
 72         if(data==null){return null;}
 73         double[][] datab = data.getMatrixData();
 74         MatrixData c = null;
 75         if(sameLength(data)){
 76             double[][] datac = new double[this.matrixData.length][this.matrixData[0].length];
 77             for(int i=0;i<this.matrixData.length;i++){
 78                 for(int j=0;j<this.matrixData[0].length;j++){
 79                     datac[i][j] = this.matrixData[i][j] * datab[i][j];
 80                 }
 81             }
 82             c = new MatrixData(datac);
 83             return c;
 84         }else{
 85             return c;
 86         }
 87     }
 88     
 89     public MatrixData division(MatrixData data){
 90         if(data==null){return null;}
 91         double[][] datax = data.getMatrixData();
 92         MatrixData c = null;
 93         if(sameLength(data)){
 94             double[][] datac = new double[this.matrixData.length][this.matrixData[0].length];
 95             for(int i=0;i<this.matrixData.length;i++){
 96                 for(int j=0;j<this.matrixData[0].length;j++){
 97                     if(datax[i][j]==0){
 98                         System.out.println("商不能为零");
 99                         break;
100                     }else{
101                         datac[i][j] = (this.matrixData[i][j] / datax[i][j]);
102                     }
103                 }
104             }
105             c = new MatrixData(datac);
106             return c;
107         }else{
108             return c;
109         }
110     }
111     
112     //判断二维长度是否相等
113     public boolean sameLength(MatrixData b){
114         if(this.matrixData.length != b.matrixData.length || this.matrixData[0].length != b.matrixData[0].length){
115             return false;
116         }else{
117             return true;
118         }
119     }
120 
121     //默认的二维数组
122     private void init() {
123         this.matrixData = new double[][]{{1,2,0},{4,5,6},{7,8,9}};
124     }
125     
126     public double[][] getMatrixData() {
127         return matrixData;
128     }
129 
130     public void setMatrixData(double[][] matrixData) {
131         this.matrixData = matrixData;
132     }
133 
134     public Object clone(){
135         try {
136             System.out.println("调用clone方法");
137             MatrixData src = (MatrixData)super.clone();
138             src.setMatrixData(this.matrixData);
139             return src;
140         } catch (CloneNotSupportedException e) {
141             e.printStackTrace();
142         }
143         return null;
144     }
145     
146     public int hashCode(){
147         return this.toString().hashCode();
148     }
149     
150     /**
151      * 在比较的过程中涉及到多层嵌套条件判断,最外层的正反两面都要给予对应的返回结果,如果内层的返回结果同外层不一致,则需指定确切的返回结果,
152      * 反面情况保持默认的返回结果
153      */
154     public boolean equals(Object data){
155         if(data==null){
156             return false;
157             }
158         if(data instanceof MatrixData){
159             MatrixData datax = (MatrixData) data;
160             if(sameLength(datax)){
161                 for(int i=0;i<this.matrixData.length;i++){
162                     for(int j=0;j<this.matrixData[0].length;j++){
163                         if(this.matrixData[i][j] != datax.matrixData[i][j]){
164                             return false;
165                         }
166                     }
167                 }
168             }
169         return true;
170         }else{return false;}
171     }
172     //二位数组的二维长度相等
173     public boolean arraySameLength(double[][] b){
174         for(int i=0;i<b.length-1;i++){
175             if(b[i].length != b[i+1].length){
176                 return false;
177             }
178         }
179         return true;
180     }
181     
182     //将所有的打印信息放入StringBuffer中再转换为String类型,包括空格和换行
183     public String arrayToString(double[][] b){
184         StringBuffer sb = new StringBuffer("");
185         
186         //按照指定的格式进行格式化
187         DecimalFormat df = new DecimalFormat();
188         String pattern = "0.00";
189         df.applyPattern(pattern);
190         
191         for(int i=0;i<b.length;i++){
192             for(int j=0;j<b[0].length;j++){
193 //                sb.append((Double.valueOf(b[i][j])).toString()).append(" ");
194                 sb.append(df.format((Double.valueOf(b[i][j]))).toString()).append(" ");
195             }
196             sb.append("\n");
197         }
198         return  sb.toString();
199     }
200     
201     @Override
202     public String toString() {
203 //        return "MatrixData [matrixData=" + Arrays.toString(matrixData) + "]";
204         return this.arrayToString(this.matrixData);
205     }
206     
207     public void display(){
208         System.out.println(this.toString());
209     }
210 
211 }
 1 package com.jdk7.chapter4;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         double[][] array0 = new double[][]{{9.0,8.0,7.0},{6.0,5.0,4.0},{3.0,2.0,1.0}};
 6         MatrixData m0 = new MatrixData(array0);
 7         MatrixData m1 = new MatrixData();
 8         System.out.print("数组m0为: ");
 9         m0.display();
10         System.out.print("数组m1为: ");
11         m1.display();
12         System.out.print("数组(m0 + m1)为: ");
13         m0.add(m1).display();
14         System.out.print("数组(m0 - m1)为: ");
15         m0.sub(m1).display();
16         System.out.print("数组(m0 * m1)为: ");
17         m0.multiply(m1).display();
18         MatrixData m2 = (MatrixData)m0.clone();
19         System.out.print("从m0克隆的m2为: ");
20         m2.display();
21         System.out.println("m0的哈希码为: "+m0.hashCode());
22         System.out.println("m2的哈希码为: "+m2.hashCode());
23         System.out.println("m0和m2是否相等: "+m0.equals(m2));
24         System.out.print("数组m3为: ");
25         MatrixData m3 = null;
26         UsingArrays ua = new UsingArrays();
27         System.out.println("m0和m3是否相等: "+m0.equals(m3));
28         System.out.println("m0和m1是否相等: "+m0.equals(m1));
29         System.out.println("m0和ua是否相等: "+m0.equals(ua));
30         
31         System.out.print("数组(m0 / m1)为: ");
32         m0.division(m1).display();
33     }
34 
35 }
36 
37 
38 执行结果:
39 数组第二维长度都相等
40 数组m0为: 9.00 8.00 7.00 
41 6.00 5.00 4.00 
42 3.00 2.00 1.00 
43 
44 数组m1为: 1.00 2.00 0.00 
45 4.00 5.00 6.00 
46 7.00 8.00 9.00 
47 
48 数组(m0 + m1)为: 数组第二维长度都相等
49 10.00 10.00 7.00 
50 10.00 10.00 10.00 
51 10.00 10.00 10.00 
52 
53 数组(m0 - m1)为: 数组第二维长度都相等
54 8.00 6.00 7.00 
55 2.00 0.00 -2.00 
56 -4.00 -6.00 -8.00 
57 
58 数组(m0 * m1)为: 数组第二维长度都相等
59 9.00 16.00 0.00 
60 24.00 25.00 24.00 
61 21.00 16.00 9.00 
62 
63 调用clone方法
64 从m0克隆的m2为: 9.00 8.00 7.00 
65 6.00 5.00 4.00 
66 3.00 2.00 1.00 
67 
68 m0的哈希码为: 363974377
69 m2的哈希码为: 363974377
70 m0和m2是否相等: true
71 数组m3为: m0和m3是否相等: false
72 m0和m1是否相等: false
73 m0和ua是否相等: false
74 数组(m0 / m1)为: 商不能为零
75 数组第二维长度都相等
76 9.00 4.00 0.00 
77 1.50 1.00 0.67 
78 0.43 0.25 0.11 

 

矩阵的加、减、乘、除、toString、equals、hashCode、clone

标签:不为   obj   oid   package   rgs   返回结果   for   4.0   jdk   

原文地址:https://www.cnblogs.com/celine/p/8428326.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!