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:
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;
    }
}
Questo è invece il main:
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);
     }
 }
Se lo eseguo con m = n = 4, k = 1, a = 2, b = 1 dovrebbe crearmi e stamparmi la matrice A come:
1000000000000000
0100000000000000
0010100000000000
0001010000000000
0000001010000000
0000000101000000
0000000000101000
0000000000010100
0000000000000010
0000000000000001
oppure se la eseguo con m = n = 4, k = 1, a = 0, b = 1 dovrebbe crearla come:
1000100010001000
0100010001000100
0010001000100010
0001000100010001
Ed invece sembra che vada in loop per rimane in esecuzione senza creare niente..
Potete aiutarmi a trovare la causa?
Grazie in anticipo.