java - 包含相同值的 HashMap

标签 java matrix hashmap jama

嗨,我使用包含整数作为键和矩阵列表作为值的 hashMap,这是代码

    import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import Jama.Matrix;


public class KFold {
public static HashMap<Integer,List<Matrix>> splitterDonnees(Matrix matReduite){
    int K =10;
    int unite = matReduite.getRowDimension()/K;
    int indexDebtest = 0;
    int indexFinTest = unite;
    Matrix matDonEntr = new Matrix(matReduite.getRowDimension()-unite,matReduite.getColumnDimension());
    Matrix matDonTest = new Matrix(unite,matReduite.getColumnDimension());
    HashMap<Integer,List<Matrix>> mapDonn = new HashMap<Integer,List<Matrix>>();

    for (int i =0;i<K;i++){
        int ireloaded = 0;
        int ireloadedEntr =0;
        for(int ii =indexDebtest; ii<indexFinTest;ii++){
            int jreloaded=0;
            for(int j =0;j<matReduite.getColumnDimension();j++){

                matDonTest.set(ireloaded, jreloaded, matReduite.get(ii, j));
                jreloaded++;
            }
            ireloaded++;

        }
        //matDonTest.print(10, 5);
        if(indexDebtest == 0){
            for(int ii =unite;ii<matReduite.getRowDimension();ii++){
                int jreloadedEntr=0;
                for(int j =0; j<matReduite.getColumnDimension();j++){
                    matDonEntr.set(ireloadedEntr, jreloadedEntr, matReduite.get(ii, j));
                    jreloadedEntr++;
                }
                ireloadedEntr++;
            }
        }

        else if (indexFinTest==matReduite.getRowDimension()){
            for(int ii =0;ii<matReduite.getRowDimension()-unite;ii++){
                int jreloadedEntr=0;
                for(int j =0; j<matReduite.getColumnDimension();j++){
                    matDonEntr.set(ireloadedEntr, jreloadedEntr, matReduite.get(ii, j));
                    jreloadedEntr++;
                }
                ireloadedEntr++;

            }
        }
        else{
            for(int ii=0;ii<indexDebtest;ii++){
                int jreloadedEntr=0;
                for(int j =0; j<matReduite.getColumnDimension();j++){
                    matDonEntr.set(ireloadedEntr, jreloadedEntr, matReduite.get(ii, j));
                    jreloadedEntr++;    
                }
                ireloadedEntr++;
            }
            for(int ii =indexFinTest;ii<matReduite.getRowDimension();ii++){
                int jreloadedEntr=0;
                for(int j =0; j<matReduite.getColumnDimension();j++){
                    matDonEntr.set(ireloadedEntr, jreloadedEntr, matReduite.get(ii, j));
                    jreloadedEntr++;

                }
                ireloadedEntr++;
            }
        }

        indexDebtest = indexDebtest+unite;
        indexFinTest = indexFinTest+unite;

        List<Matrix> coupleMatTest_MatEntr = new ArrayList<Matrix>();
        coupleMatTest_MatEntr.add(matDonTest);
        //matDonTest.print(10, 5);
        coupleMatTest_MatEntr.add(matDonEntr);
        mapDonn.put(i, coupleMatTest_MatEntr);
        //System.out.println("Les lements tests de mapDonnees sont:"+mapDonn.get(i).size());
        mapDonn.get(i).get(0).print(10, 5);
    }
    //mapDonn.get(0).get(0).print(10, 5);
    //mapDonn.get(1).get(0).print(10, 5);
    return mapDonn;
}
}

问题是返回的 hashMaps 的最终版本包含相同的最后一个矩阵的 10 倍,事情是它在循环中运行良好,因为我每次都看到不同的值,但是一旦我在返回,所有值现在都属于同一个最后一个矩阵。

编辑:Matrix 类来自 Jama 包。

最佳答案

将以下两行移到循环内:

Matrix matDonEntr = new Matrix(matReduite.getRowDimension()-unite,matReduite.getColumnDimension());
Matrix matDonTest = new Matrix(unite,matReduite.getColumnDimension());

这样,您将在循环的每次迭代中创建矩阵。否则,方法中只有这两个实例,并且您会不断更改它们,最终会多次引用它们的最后状态。

关于java - 包含相同值的 HashMap ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17326217/

相关文章:

java - 我是 android Java 的初学者。任何人都可以解释代码

java - Thymeleaf 显示 HashMap

java - 在Java中,如何使用我自己的比较标准对未实现Comparable的对象进行排序?

java - Netbeans 未使用 JDK 1.8.0_40 启动 Java DB 服务器

c# - 在 Java 中从 C# 转换标志

java:如何实现数学解析

Python 获取矩阵中具有 na 值的邻居的平均值

java - JScience Java 单位 Bar 到 Psi

matlab - 如何按 block 平均列?

java - 不区分大小写的HashMap哪个保留了原来的key?