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方法就可以使用它们。

(0)

相关推荐

  • (1条消息) 跳槽必刷算法题系列(一)

    今天是小浩算法 "365刷题" 第104天 问:程序员最讨厌康熙的哪个儿子. 答:胤禩. 01 PART 搜索二维矩阵 这道题目非常的高频!看起来是在考察矩阵搜索,其实和矩阵一点关 ...

  • 剑指offer

    03 数组中重复的数字 public int findRepeatNumber(int[] nums){ //排序后的数组,重复元素必然相邻 Arrays.sort(nums); //结果集 int ...

  • Codeforces Round #691 (Div. 2)A-C题

    Div2第一次AC两道题 A题: 直接比较一张卡片上的两个数,blue大blue ,red大red ,最后比较(当时就凭感觉应该是这样qwq) #include<iostream>#inc ...

  • Java高并发16-LongAdder类源码解析(下)

    一.复习 上次连载简单的介绍了其他函数的作用以及功能 二.完整的LongAdder类源码 package com.ruigege.AtomicOperationClass4;import java.u ...

  • Java学习——38、类的抽象性

    抽象是研究复杂对象的基本方法,从复杂对象中抽象出本质特征,忽略次要细节,使某些信息和实现对于使用者不可见.抽象层次越高,其软件利用程序越高. 1.抽象类 使用关键字abstract声明的类为抽象类. ...

  • Java学习——37、类的多态(二)

    类型的多态主要体现在:子类是一种父类类型. 子类通过继承扩充和发展了它的父类,子类是父类的一种特殊类型. 1.子类对象即是父类对象 子类对象包含了父类的所有成员,包括成员变量和成员方法,所以子类对象也 ...

  • Java学习——36、类的多态(一)

    多态性是指"一种定义,多种实现".例如,画画.同是画画,但每一个人,会画出来不同的画,这就是多态. 多态主要有方法的多态和类型的多态. 今天介绍方法的多态. 方法的多态包括方法的重 ...

  • Java学习——34、类的继承

    面向对象四大特性:封装.继承.多态.抽象. 今天介绍继承. 继承是面向对象的核心特性,能够最大限度地实现代码复用. 1.  由继承派生类 继承允许在已有类的基础上创建新类. 创建的新类叫做子类(或派生 ...

  • Java学习_Java核心类

    字符串和编码 字符串在String内部是通过一个char[]数组表示的,因此,可以按下面的写法: String s2 = new String(new char[] {'H', 'e', 'l', ' ...

  • Java基础教程:Java的对象和类

    Java是一种面向对象的编程语言,那什么是对象,什么是类,又怎么使用呢? 什么是对象 客观存在的事物皆为对象,所以我们也常常说万物皆对象.换作Java语言,对象是一种类的实例.相当于现实生活中加一个量 ...

  • Java中的Reference类使用

    Java 2 平台引入了 java.lang.ref 包,这个包下面包含了几个Reference相关的类,Reference相关类将Java中的引用也映射成一个对象,这些类还提供了与垃圾收集器(gar ...

  • java 入门如何设计类

    2019/12/24   |    在校大二上学期    |    太原科技大学 初学java后,我们会发现java难点不在于Java语法难学,而是把我们挂在了如何设计类的"吊绳" ...