Matrice Trasposta

di il
1 risposte

Matrice Trasposta

Ho in input questo file :

{{1,3,4},{5,6,7},{1,2,3}} //questo diventa una matrice con 3 righe e 3 colonne
{{1},{2},{3}}
{{1}}

che leggo in modo corretto, e nel quale mi viene chiesto di calcolare la trasposta di tutte le matrici ma non capisco come poter fare..

Ho il mio Main :

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

public class Main {

	public static void main(String[] args) throws Exception{
		BufferedReader br;
			List<Matrice> matrici = new ArrayList<Matrice>();
			br = new BufferedReader(new FileReader("input.txt"));
			String line= br.readLine();
			while(line != null){
				/*TESTO ESAME INIZIO*/
				int [][] matrice;
				line = line.substring(1, line.length()-1);
				
				String [] righe = line.split("\\},\\{"); // con le graffe devo mettere sempre il doppio slash
				matrice = new int[righe.length][];
				for (int i=0;i<righe.length;i++){
					righe[i] = righe[i].replaceAll("\\{", ""); //cambia la graffa con lo spazio vuoto
					righe[i] = righe[i].replaceAll("\\}", "");
					String [] colonne = righe[i].split(",");
					matrice[i] = new int[colonne.length];
					for(int j=0;j<colonne.length;j++){
						
						matrice [i][j]= Integer.parseInt(colonne[j]);
					}
				}
				Matrice m = new Matrice (matrice);
				matrici.add(m);
				/*TESTO ESAME FINE*/
				line= br.readLine();
			}
			System.out.println(matrici);
			br.close();
			
			
			
			 PrintWriter pw1 = new PrintWriter(new FileWriter("1.txt"));
				for(Matrice m : matrici){
					ArrayList<ArrayList<Integer>> x = m.Matrice_trasposta();
					for(int i=0;i<x.size();i++){
						for(int j=0;j<x.get(i).size();j++)
							pw1.print(x.get(i).get(j) + "\t");
						pw1.println();
					}
				}
				pw1.println();
				pw1.close();
			
			
			
			
	}
}
e la mia classe Matrice :

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class Matrice {
private int[][] matrice;

public Matrice(int[][] matrice) {
	this.matrice = matrice;
}


public String toString() {
	String result = "\n";
	for (int i=0;i<matrice.length;i++){
		 for(int j=0;j<matrice[i].length;j++){
			 result += (matrice [i][j]+ " ");
		}
		 result += "\n"; //E' equivalente al System.out.println()
	}                                     // Uso questo perchè devo ritornare una stringa
	return result;
	}

public ArrayList<ArrayList<Integer>> Matrice_trasposta (){
	// non per forza deve essere una matrice quadrata
	
	ArrayList<ArrayList<Integer>> arrayBlocco = new ArrayList<ArrayList<Integer>>(); 
	for(int i = 0; i < matrice.length; i++){ 
		ArrayList<Integer>array= new ArrayList<Integer>();
		 for(int j = 0; j < matrice[i].length; j++) 
			array.add(matrice [i][j]);
		 arrayBlocco.add(array);
	}
	return arrayBlocco;
}
}
Penso che nel Main ho fatto bene, il problema è il metodo presente nella classe Matrice... mi verrebbe da fare :

array.add(matrice [j]);
arrayBlocco.add(array);

Ma ovviamente in questo modo mi da errore..

P.s.: ovviamente al momento ho messo array.add(matrice [j]); nel metodo presente nella classe Matrice e comprendo benissimo che non fa altro che riscrivermi in modo "normale" la matrice.. ma era solo per vedere se il mio codice in Main fosse "buono" o meno

1 Risposte

  • Re: Matrice Trasposta

    Partiamo dal concetto matematico: la trasposta è la matrice risultante in cui vengono scambiate le righe con le colonne rispetto alla originale.

    Quindi se hai una matrice
    {
        {1, 2, 3, 4, 5},
        {6, 7, 8, 9, 10}
    }
    La trasposta ti deve venire:
    {
        {1, 6},
        {2, 7},
        {3, 8},
        {4, 9},
        {5, 10}
    }

    Quindi ti direi innanzitutto di impostare la classe Matrice in questo modo:
    public class Matrice {
        private int[][] matrice;
    
        // costruttore, ecc..
    
        public Matrice trasposta() {
            // ... completa tu
        }
    }
    Ovvero nota il metodo trasposta(). Restituisce un NUOVO oggetto Matrice che contiene l'array bidimensionale "trasposto" rispetto all'oggetto Matrice originale. E non ti servono gli ArrayList. Ti basta creare un nuovo array int[][] .

    Il design che ti ho indicato è corretto/sensato, perché si ragiona sempre in termini di oggetti Matrice (la tua classe). Tanto per dirne una: non ti devi "inventare" un ulteriore modo per stampare il ArrayList di ArrayList.

    Riguardo il codice che hai scritto nella Main, non l'ho letto tutto tutto. Ti consiglio, se ti è possibile di separare bene la lettura/parsing da tutto il resto. Quei split e replaceAll sarebbero evitabili ragionando diversamente (lo split(",") per i valori è l'unico che è davvero utile/sensato).
Devi accedere o registrarti per scrivere nel forum
1 risposte