Java 广义稀疏矩阵加法

Java 广义稀疏矩阵加法,java,generics,sparse-matrix,Java,Generics,Sparse Matrix,我有一个任务,我应该在一个通用稀疏矩阵上完成实现。我被附加部分卡住了。矩阵只支持数字,所以我让它扩展数字,希望我能把数字相加,这是错误的。数据结构不是数组,它本质上是两个链表。(一行一列)下面是相关代码: public MatrixSparse<? extends Number> addition(MatrixSparse<? extends Number> A, MatrixSparse<? extends Number> B, MatrixSparse&l

我有一个任务,我应该在一个通用稀疏矩阵上完成实现。我被附加部分卡住了。矩阵只支持数字,所以我让它扩展数字,希望我能把数字相加,这是错误的。数据结构不是数组,它本质上是两个链表。(一行一列)下面是相关代码:

public MatrixSparse<? extends Number> addition(MatrixSparse<? extends Number> A, MatrixSparse<? extends Number> B, MatrixSparse<? extends Number> result) {
    for (int i = 0; i < r.length; i++) {
        for(int j = 0; j < c.length; j++) {
            // set (i, j) to the sum of A(i,j) and B(i,j) is giving me an error
            // "+" is undefined for type capture#2-? etc.
            result.set(i, j, (A.get(i, j) + B.get(i, j)));
        }
    }
    return result;
}

公共矩阵解析我有三点建议:

  • 开始编写代码。看起来你已经发布了你已经开始的骨架,并期望这里的人为你填写。发布一些代码,并在出现问题时提出特定问题
  • 你能写一个成功的非稀疏矩阵加法吗?至少在你开始之前你已经解决了这个问题
  • 我会忘记泛型,直到你有了工作。首先添加整数或双精度矩阵,然后添加泛型

  • 你为什么要写你自己的斯巴达矩阵?这个问题是相当普遍的,如果你自己尝试的话,它肯定会重新发明轮子。快速谷歌搜索显示,例如:


    如果LGPL许可证并没有吓跑您,这是很好的,但我相信还有很多其他地方您可以准备好并测试实现,这将非常适合使用。我宁愿把时间花在寻找解决方案上,也不愿再去发明它。

    然后把它当作一个心理/学校练习:你不能用“+”操作符添加两个泛型-操作符不是“可泛型的”,你不能在Java中重载它们(与C++非常不同),自动装箱也没有帮助。我认为你能做的唯一一件事就是在你的矩阵中写一个通用的T add(T paramLeft,T paramRight),然后这样做:

    if (paramLeft instanceof Integer) {
         return new Integer(((Integer)paramLeft).intValue()+ ((Integer)paramRight).intValue());
    } elseif (paramLeft instanceof Double) { 
         ....
    }
    

    叹息。。。这是我的密码。我知道如何制作一个正规矩阵,非泛型的,泛型的。我以前做过这一切。我只想知道当类型未知时如何添加矩阵。这将是一个整数或浮点,所以没有任何担心。不要只是假设我要求别人“替我填写”这是一些代码,这是我在出错时问的一个特定问题。这是一项任务,我不一定要这样做,但我必须这样做。我相信,如果可以,你可以尝试与做出决定的人核实“站在巨人的肩膀上”,让它在5分钟内工作和测试,而不是花上几天的时间……如果没有真正的理由再写一次,你还是要写……那就换工作。真的。这显然是学校的家庭作业,而不是某个随意的经理的工作(除非我大错特错).您想要
    MatrixSparse@Michael不管头是什么样子的,我只想让它用于浮点运算,我想可能有些混乱是因为自动装箱使它看起来像“+”确实超载了。实际上,更好的办法是使用一个类型为
    Operations
    或类似的对象来进行加法(以及以后的乘法),并传递给矩阵对象。然后实现
    操作
    操作
    if (paramLeft instanceof Integer) {
         return new Integer(((Integer)paramLeft).intValue()+ ((Integer)paramRight).intValue());
    } elseif (paramLeft instanceof Double) { 
         ....
    }