Salve ragazzi, ho un problema con un codice..sono quasi 2 mesi che ci lavoro sopra per un motivo o per un'altro e adesso che credevo di essere riuscito (in linea teorica) ad arrivare al risultato, quando eseguo il codice, non fà nulla, rimane in run..(Uso NetBeans IDE 7.0.1) senza stampare niente...
Vi posto il codice:
Questo è invece il main:codice:import java.util.*; import javax.swing.*; public final class Matrice { private int[][] A; // matrice A private int[] r; // vettore r a valori casuali int[] xa; // vettore che mi conterrà le ascisse delle direzioni int[] yb; // vettore che mi conterrà le ordinate delle direzioni Random random = new Random(); ArrayList<HashMap<Integer, ArrayList<Coppia>>> listaMappe = new ArrayList<HashMap<Integer, ArrayList<Coppia>>>(); ArrayList<ArrayList> listaVettoriC = new ArrayList<ArrayList>(); HashMap<Integer, ArrayList<Coppia>> mappa; /* costruttore che prende in input il numero di direzioni e le dimensioni della griglia */ public Matrice(int m, int n, int k) { int righe = 0; for (int i = 0; i < k; i++) { try { /* Inserisco le coordinate (a,b) per determinare le direzioni */ int a, b; do { a = Integer.parseInt(JOptionPane.showInputDialog(null, "Inserisci l'ascissa della " + (i + 1) + " direzione:")); if (a < 0) { System.err.println("Errore: Inserire un valore intero positivo dell'ascissa."); } } while (a < 0); b = Integer.parseInt(JOptionPane.showInputDialog(null, "Inserisci l'ordinata della " + (i + 1) + " direzione (può essere anche negativa):")); /*Verifico la proprietà che devono rispettare a,b*/ if (a != 0 && b != 0) { // esempio (3,4) if (coprimi(a, b) == false) { System.err.println("Errore: le coordinate inserite non sono coprime, inserire delle coordinate con Massimo Comun Divisore uguale a 1."); break; } } /*Creo il vettore degli c per questa direzione e lo salvo in un ArrayList*/ listaVettoriC.add(cList(m, n, a, b)); /*Sommo le dimensioni dei vettori creati per aver il numero di righe che formeranno la matrice A*/ righe += (listaVettoriC.get(i)).size(); /*Creo la HashMap della direzione (a,b) di dimensione del vettore c e la salvo nell' ArrayList listaMappe*/ mappa = new HashMap<Integer, ArrayList<Coppia>>((listaVettoriC.get(i)).size()); listaMappe.add(mappaCoordinate(m, n, a, b)); System.out.println("l'ascissa della " + (i + 1) + " direzione è " + a + " l'ordinata " + b); } catch (Exception e) { } } A = new int[righe][m * n]; /*Range delle righe per ogni direzione*/ int startRow = 0; int dimDir = (listaVettoriC.get(0)).size(); for (int i = 0; i < k; i++) { // per ogni direzione riempio la matrice A if (i != 0) { startRow += (listaVettoriC.get(i - 1)).size(); dimDir = dimDir + (listaVettoriC.get(i)).size(); } for (int row = startRow; row < dimDir; row++) { //scandisco le righe int col = 0; // scandisco le colonne if ((listaMappe.get(i)).containsKey((listaVettoriC.get(i)).get(row))) { // cerco c nella HashMap ArrayList<Coppia> coordinate = ((listaMappe.get(i)).get((listaVettoriC.get(i)).get(row))); // estraggo la lista di coppie for (int s = 0; s < coordinate.size(); s++) { // memorizzo ordinate e ascisse in due vettori xa[s] = (coordinate.get(s)).get_x(); yb[s] = (coordinate.get(s)).get_y(); } for (int y = m - 1; y >= 0; y--) { for (int x = 0; x < n; x++) { for (int index = 0; index < xa.length; index++) { if (x == xa[index] && y == yb[index]) { A[row][col] = 1; } else { A[row][col] = 0; } } col++; } } } } } } /*Creo un vettore contenente tutti i valori di c corrispondenti alle rette della direzzione scelta; ha ordine decrescente in modo da far corrispondere la prima retta con vettore[0] a partire da max, cioè da (0,m-1)*/ public ArrayList cList(int m, int n, int a, int b) { ArrayList vettore = new ArrayList(); for (int y = m - 1; y >= 0; y--) { for (int x = 0; x < n;) { int c = -b * x + a * y; if (vettore.contains(c) == false) { vettore.add(c); } } } Collections.sort(vettore); Collections.reverse(vettore); return vettore; } /*Crea la Mappa Hash che associa ad ogni key c una coppia di valori (x,y), ovvero gli indici che mi serviranno per mettere ugali a 1 gli elementi corrispondenti in A*/ public HashMap<Integer, ArrayList<Coppia>> mappaCoordinate(int m, int n, int a, int b) { for (int y = m - 1; y >= 0; y--) { for (int x = 0; x < n;) { int c = -b * x + a * y; if (mappa.containsKey(c)) { // C'è già una mappatura... ottengo l'ArrayList e aggiungo la nuova coppia ArrayList<Coppia> lista = mappa.get(c); lista.add(new Coppia(x, y)); } else { // Non c'è nessuna mappatura: la aggiungo ArrayList<Coppia> lista = new ArrayList<Coppia>(); lista.add(new Coppia(x, y)); mappa.put(c, lista); } } } return mappa; } }
Se lo eseguo con m = n = 4, k = 1, a = 2, b = 1 dovrebbe crearmi e stamparmi la matrice A come:codice:import javax.swing.*; import java.io.*; public class ProvaMain { public static void main(String[] args) throws IOException { int m = Integer.parseInt(JOptionPane.showInputDialog(null, "inserisci il numero di righe della griglia: ")); int n = Integer.parseInt(JOptionPane.showInputDialog(null, "inserisci il numero di colonne della griglia: ")); int k = Integer.parseInt(JOptionPane.showInputDialog(null, "inserisci il numero di direzioni: ")); Matrice A = new Matrice(m, n, k); A.stampa(m, n); } }
oppure se la eseguo con m = n = 4, k = 1, a = 0, b = 1 dovrebbe crearla come:1000000000000000
0100000000000000
0010100000000000
0001010000000000
0000001010000000
0000000101000000
0000000000101000
0000000000010100
0000000000000010
0000000000000001
Ed invece sembra che vada in loop per rimane in esecuzione senza creare niente..1000100010001000
0100010001000100
0010001000100010
0001000100010001
Potete aiutarmi a trovare la causa?
Grazie in anticipo.

Rispondi quotando

