-
Java泛型——泛型矩阵类
Java泛型——泛型矩阵类
所有矩阵,加法和乘法操作都是类似,所以设计一个父类,不用管元素类型,目的描述所有类型的矩阵共享的通用操作
创建若干适用于指定矩阵类型的子类,实例:两种类型int和Rational的实现
1、GenericMatrix类
public abstract class GenericMatrix <E extends Number>{ protected abstract E add(E o1,E o2); protected abstract E multiply(E o1,E o2); protected abstract E zero(); public E[][] addMatrix(E[][]matrix1,E[][]matrix2){ if((matrix1.length!=matrix2.length)||(matrix1[0].length!=matrix2[0].length)){ throw new RuntimeException("The matrices do not have the same size"); } E[][] result=(E[][])new Number[matrix1.length][matrix1[0].length]; for(int i=0;i<result.length;i++) for(int j=0;j<result[i].length;j++){ result[i][j]=add(matrix1[i][j],matrix2[i][j]); } return result; } public E[][] mulyiplyMartix(E[][]matrix1,E[][]matrix2){ if((matrix1.length!=matrix2.length)||(matrix1[0].length!=matrix2[0].length)){ throw new RuntimeException("The matrices do not have the same size"); } E[][] result=(E[][])new Number[matrix1.length][matrix2[0].length]; for(int i=0;i<result.length;i++) for(int j=0;j<result[0].length;j++){ result[i][j]=zero(); for(int k=0;k<matrix1[0].length;k++){ result[i][j]=add(result[i][j],multiply(matrix1[i][k],matrix2[k][j])); } } return result; } public static void printResult(Number[][] m1,Number[][] m2,Number[][]m3,char op){ for(int i=0;i<m1.length;i++){ for(int j=0;j<m1[0].length;j++) System.out.print(" "+m1[i][j]); if(i==m1.length/2) System.out.print(" "+op+" "); else System.out.print(" "); for(int j=0;j<m2.length;j++) System.out.print(" "+m2[i][j]); if(i==m1.length/2) System.out.print(" = "); else System.out.print(" "); for(int j=0;j<m3.length;j++) System.out.print(m3[i][j]+" "); System.out.println(); } } }
2、IntegerMatrix类
public class IntegerMatrix extends GenericMatrix<Integer>{ @Override protected Integer add(Integer o1, Integer o2) { return o1+o2; } @Override protected Integer multiply(Integer o1, Integer o2) { return o1*o2; } @Override protected Integer zero() { return 0; } }
3、RationalMatrix类
public class Rational extends Number{ private long numerator=0; private long denominator=1; public Rational(){ this(0,1); } public Rational(long num1,long num2){ long gcd=gcd(num1,num2); this.numerator=(num2>0?1:-1)*num1/gcd; this.denominator=Math.abs(num2)/gcd; } private static long gcd(long n,long d){ long n1=Math.abs(n); long n2=Math.abs(d); int gcd=1; for(int k=1;k<=n1&&k<=n2;k++){ if(n1%k==0&&n2%k==0) gcd=k; } return gcd; } public String toString(){ if(denominator==1) return numerator+""; else return numerator+"/"+denominator; } @Override public double doubleValue() { // TODO 自动生成的方法存根 return numerator*1.0/denominator; } @Override public float floatValue() { // TODO 自动生成的方法存根 return (float) doubleValue(); } @Override public int intValue() { // TODO 自动生成的方法存根 return (int) doubleValue(); } @Override public long longValue() { // TODO 自动生成的方法存根 return (long) doubleValue(); } public long getNumerator(){ return numerator; } public long GetDenominator(){ return denominator; } public Rational add(Rational second){ long n=numerator*second.GetDenominator()+denominator*second.getNumerator(); long d=denominator*second.GetDenominator(); return new Rational(n,d); } public Rational multiply(Rational second){ long n=numerator*second.getNumerator(); long d=denominator*second.GetDenominator(); return new Rational(n,d); } }
4、Rational类
public class Rational extends Number{ private long numerator=0; private long denominator=1; public Rational(){ this(0,1); } public Rational(long num1,long num2){ long gcd=gcd(num1,num2); this.numerator=(num2>0?1:-1)*num1/gcd; this.denominator=Math.abs(num2)/gcd; } private static long gcd(long n,long d){ long n1=Math.abs(n); long n2=Math.abs(d); int gcd=1; for(int k=1;k<=n1&&k<=n2;k++){ if(n1%k==0&&n2%k==0) gcd=k; } return gcd; } public String toString(){ if(denominator==1) return numerator+""; else return numerator+"/"+denominator; } @Override public double doubleValue() { // TODO 自动生成的方法存根 return numerator*1.0/denominator; } @Override public float floatValue() { // TODO 自动生成的方法存根 return (float) doubleValue(); } @Override public int intValue() { // TODO 自动生成的方法存根 return (int) doubleValue(); } @Override public long longValue() { // TODO 自动生成的方法存根 return (long) doubleValue(); } public long getNumerator(){ return numerator; } public long GetDenominator(){ return denominator; } public Rational add(Rational second){ long n=numerator*second.GetDenominator()+denominator*second.getNumerator(); long d=denominator*second.GetDenominator(); return new Rational(n,d); } public Rational multiply(Rational second){ long n=numerator*second.getNumerator(); long d=denominator*second.GetDenominator(); return new Rational(n,d); } }
5、TestIntegerMatrix 类
public class TestIntegerMatrix { public static void main(String args[]){ Integer[][] m1=new Integer[][]{{1,2,3},{4,5,6},{1,1,1}}; Integer[][] m2=new Integer[][]{{1,1,1},{2,2,2},{0,0,0}}; IntegerMatrix integerMatrix=new IntegerMatrix(); System.out.println("\nm1+m2 is"); GenericMatrix.printResult(m1, m2, integerMatrix.addMatrix(m1, m2), '+'); System.out.println("\nm1*m2 is"); GenericMatrix.printResult(m1, m2, integerMatrix.mulyiplyMartix(m1, m2), '+'); } }
6、TestRationalMatrix 类
public class TestRationalMatrix { public static void main(String []args){ Rational[][] m1=new Rational[3][3]; Rational[][] m2=new Rational[3][3]; for(int i=0;i<m1.length;i++) for(int j=0;j<m1[0].length;j++){ m1[i][j]=new Rational(i+1,j+5); m2[i][j]=new Rational(i+1,j+6); } RationalMatrix rationalMartrix=new RationalMatrix(); System.out.println("\nm1+m2 is"); GenericMatrix.printResult(m1, m2, rationalMartrix.addMatrix(m1, m2), '+'); System.out.println("\nm1*m2 is"); GenericMatrix.printResult(m1, m2, rationalMartrix.mulyiplyMartix(m1, m2), '*'); } }
IntegerMatrix和RationalMatrix是GenericMatrix的具体子类。这两个类实现了在GenericMatrix类中定义的add、multiply和zero方法。矩阵元素的类型Number的泛型子类。这样就可以使用任意Number子类的对象,只要在子类中实现了add、multiply和zero方法就可以使用它们。
原文:https://www.cnblogs.com/Bluebells/p/14290929.html
最新更新
求1000阶乘的结果末尾有多少个0
详解MyBatis延迟加载是如何实现的
IDEA 控制台中文乱码4种解决方案
SpringBoot中版本兼容性处理的实现示例
Spring的IOC解决程序耦合的实现
详解Spring多数据源如何切换
Java报错:UnsupportedOperationException in Col
使用Spring Batch实现批处理任务的详细教程
java中怎么将多个音频文件拼接合成一个
SpringBoot整合ES多个精确值查询 terms功能实
数据库审计与智能监控:从日志分析到异
SQL Server 中的数据类型隐式转换问题
SQL Server中T-SQL 数据类型转换详解
sqlserver 数据类型转换小实验
SQL Server数据类型转换方法
SQL Server 2017无法连接到服务器的问题解决
SQLServer地址搜索性能优化
Sql Server查询性能优化之不可小觑的书签查
SQL Server数据库的高性能优化经验总结
SQL SERVER性能优化综述(很好的总结,不要错
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比