2013-06-26 1 views
0

Привет я использовать HashMap, содержащий целые числа в качестве ключей и списка матрицы в качестве значений, здесь код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 раз та же самая последняя матрица, дело в том, что она хорошо работает в цикле, так как я вижу разные значения каждый раз, но как только я печатаю значения непосредственно перед возвратом, все значения теперь имеют одинаковую последнюю матрицу.

EDIT: Класс Matrix - это пакет Jama.

+0

Класс Matrix - это класс, представляющий собой пакет jama. – user2133558

+1

Хорошо, проблема в том, что вы не создаете 'новые' матрицы внутри цикла, вы только редактируете существующие экземпляры. – jlordo

+0

Спасибо, что разрешено. – user2133558

ответ

1

Переместите следующие две строки внутри цикла:

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

Таким образом, вы будете создавать new матрицы на каждой итерации цикла. В противном случае в этом методе присутствуют только эти два экземпляра, и вы постоянно меняете их, оканчивая множество ссылок на их последнее состояние.

 Смежные вопросы

  • Нет связанных вопросов^_^