Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    26

    [Java] problema calcolo numeri pari di una matrice

    Ciao a tutti, ho un problema con un esercizio, ecco il testo:

    La classe Compito contiene un metodo pubblico di classe che riceve in ingresso una matrice quadrata m.
    Tale metodo individua la colonna della matrice m che contiene più numeri pari e restituisce una LinkedList che contiene tutti i numeri pari della colonna in questione.
    - Si scriva la classe Compito ed il suo metodo colonnaMaxPari.
    - Si scriva la classe ProvaCompito contenente il solo metodo main, il quale svolge le seguenti operazioni:
    o Crea una matrice quadrata di interi m. Sia la dimensione di m sia i valori da inserire in m sono decise dall’utente.
    o Usando la classe Compito individua la colonna con più numeri pari e visualizza questi all’utente.

    Ho scritto una interfaccia e poi la classe, ecco i codici:

    codice:
     
    public interface List {
    
    	/* ritorna il numero di elementi nella lista*/
    
    	public int size ();
    
    	/* aggiunge l'oggetto obj in testa alla lista */
    
    	public void addToHead (Object obj);
    
    }
    codice:
    class Compito implements List  {
    
    	private Entry head;
    	private int size;
    
    	private static class Entry	{
    
    	Object element; //elemento rappresentato
    	Entry next; //successore
    
    	/* crea un oggetto entry, dato l’elemento e il successore */
    
    	Entry(Object element, Entry next) {
    
    		this.element = element;
    		this.next = next;
    	}
    }
    
    	public Compito() {
    
    		this.head=null;
    		this.size=0;
    	}
    
    	/* ritorna il numero di elementi nella lista*/
    
    	public int size() {
    
    		return this.size;
    	}
    
    	/* aggiunge l'oggetto obj in testa alla lista */
    
    	public void addToHead(Object obj) {
    
    		Entry e = new Entry(obj,this.head);
    		this.head=e;
    		this.size++;
    	}
    
    	/* metodo che individua la colonna della matrice m che contiene più numeri pari e restituisce una LinkedList
    	   che contiene tutti i numeri pari della colonna in questione.*/
    
    	public Compito colonnaMaxPari(int[][] mat)  {
    
    		Compito result = new Compito();
    		int[] temp = new int[mat.length];
    		int maxPari=0;
    
    		for(int j=0;j<mat.length;j++) {
    
    		int count=0; 	// variabile contatore: tiene conto dei numeri pari di ogni colonna
    
    			for(int i=0;i<mat.length;i++) {
    				if(mat[i][j]%2==0)
    				   temp[i]=mat[i][j];
    				   count++;
    		}
    	}
    		 	
    	}
    
    }
    Il problema è il metodo colonnaMaxPari(qui è incompleto). L'idea è copiare tutti i numeri pari delle varie colonna in più array, effettuare un confronto tra la lunghezza degli array e prendere quello più lungo. Poi convertire i valori in Object, tramite la classe Integer. La prima parte del metodo credo vada bene. Ora, la mia domanda è: come sono referenziati i vari array?non riesco a confrontarli!!

  2. #2
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Non ho capito bene l'utilità di creare un meccanismo per la gestione delle liste quando ti è esplicitamente richiesto dalla traccia di restituire una LinkedList...
    Io avrei fatto l'implementazione in modo leggermente diverso (avrei tenuto in memoria solo 2 liste: la più lunga trovata fino a quel momento e quella relativa alla colonna analizzata ad ogni iterazione), ma visto lo scopo didattico credo sia solo un peccato veniale...

    Volendo seguire l'algoritmo risolutivo che hai scelto devi:
    - creare un array di liste
    - iterare sulle colonne (ATTENZIONE: i tuoi due cicli su "j" e "i" iterano entrambi sulle righe, controlla la condizione di uscita)
    - per ogni colonna, inizializzare l'elemento corrispondente dell'array di liste (che altrimenti sarebbe null)
    - per ogni colonna, iterare su tutte le righe, andando ad inserire nella lista associata alla colonna i numeri pari
    - conclusa l'analisi della matrice, iterare sull'array delle liste, andando ad identificare la più lunga
    - restituire la lista trovata

    Non ti posto codice per darti modo di pensarci su, eventualmente segnala se hai dubbi sulla logica o sulla implementazione dell'algoritmo

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    26
    Originariamente inviato da desa
    Non ho capito bene l'utilità di creare un meccanismo per la gestione delle liste quando ti è esplicitamente richiesto dalla traccia di restituire una LinkedList...
    Io avrei fatto l'implementazione in modo leggermente diverso (avrei tenuto in memoria solo 2 liste: la più lunga trovata fino a quel momento e quella relativa alla colonna analizzata ad ogni iterazione), ma visto lo scopo didattico credo sia solo un peccato veniale...

    Volendo seguire l'algoritmo risolutivo che hai scelto devi:
    - creare un array di liste
    - iterare sulle colonne (ATTENZIONE: i tuoi due cicli su "j" e "i" iterano entrambi sulle righe, controlla la condizione di uscita)
    - per ogni colonna, inizializzare l'elemento corrispondente dell'array di liste (che altrimenti sarebbe null)
    - per ogni colonna, iterare su tutte le righe, andando ad inserire nella lista associata alla colonna i numeri pari
    - conclusa l'analisi della matrice, iterare sull'array delle liste, andando ad identificare la più lunga
    - restituire la lista trovata

    Non ti posto codice per darti modo di pensarci su, eventualmente segnala se hai dubbi sulla logica o sulla implementazione dell'algoritmo

    Con le liste purtroppo ho molta confusione. Ora ci provo, nel caso in cui sono disperato segnalerò. Grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    26
    Originariamente inviato da desa

    Volendo seguire l'algoritmo risolutivo che hai scelto devi:
    - creare un array di liste
    - iterare sulle colonne (ATTENZIONE: i tuoi due cicli su "j" e "i" iterano entrambi sulle righe, controlla la condizione di uscita)
    - per ogni colonna, inizializzare l'elemento corrispondente dell'array di liste (che altrimenti sarebbe null)
    - per ogni colonna, iterare su tutte le righe, andando ad inserire nella lista associata alla colonna i numeri pari
    - conclusa l'analisi della matrice, iterare sull'array delle liste, andando ad identificare la più lunga
    - restituire la lista trovata
    punto 1: va bene così?
    codice:
    import java.util.LinkedList;
    
    class Compito  {
    
    	private LinkedList[] lista;
    
    	public Compito() {
    
    		int dim=lista.length;
    		this.lista=new LinkedList[dim];
    	}
    }
    punto 3: non capisco come inizializzare l'elemento dell'array di liste.

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Non va tanto bene... nel senso che, ti serve creare un array di LinkedList? Ti viene chiesto di ritornarne UNA, contenente gli elementi pari della colonna contenente il maggior numero di elementi pari.

    Quindi partiamo dal presupposto che creeremo una sola LinkedList. Adesso dividiamo il problema in sottoproblemi maneggiabili: da colonnaMaxPari(int[][] m) che ritorna la LinkedList:

    codice:
    public LinkedList colonnaMaxPari(int[][] m) {
      LinkedList ll = new LinkedList();
      
    /* 
        codice corpo
      */
    
      return ll;
    }
    Che cosa andrà al posto di "codice corpo".
    All'inizio, non sappiamo quale sia la colonna contenente il maggior numero di elementi pari, né tanto meno quanti essi siano... allora come pivot possiamo prendere la prima colonna (indice 0) e supponiamo che vi siano 0 elementi pari

    codice:
    int max_index = 0;
    int max_pari = 0;
    Adesso dobbiamo andare ad analizzare la nostra matrice, per colonne, e contare quanti siano effettivamente gli elementi pari di ciascuna colonna. Per contare gli elementi pari, ci appoggiamo ad una variabile int temp_pari che andiamo ad incrementare man mano che troviamo un elemento pari

    codice:
    for (int i = 0; i < m[0].length; i++) {
                int temp_pari = 0;
                for (int j = 0; j < m.length; j++) {
                    temp_pari += (m[j][i] % 2 == 0 ? 1 : 0); //se è pari aumento di 1
                }
    // altro codice...
    }
    Dopo il ciclo for interno, in
    //altro codice

    andiamo ad aggiornare l'indice di colonna (i) contenente il maggior numero di pari ed anche il massimo numero di elementi pari trovati

    codice:
    max_index = (temp_pari > max_pari ? i : max_index);
    max_pari = (temp_pari > max_pari ? temp_pari : max_pari);
    Siamo ad un passo dalla fine del metodo: popolare la LinkedList ll con gli elementi pari della colonna contenente il massimo numero di elementi pari:
    codice:
    for (int i = 0; i < m.length; i++) {
                if (m[i][max_index] % 2 == 0) {
                    ll.add(m[i][max_index]);
                }
            }
    In definitiva, mettendo tutto insieme, una possibile implementazione del metodo maxColonnaPari potrebbe essere:

    codice:
    public LinkedList colonnaMaxPari(int m[][]) {
            int max_index = 0;
            int max_pari = 0;
            for (int i = 0; i < m[0].length; i++) {
                int temp_pari = 0;
                for (int j = 0; j < m.length; j++) {
                    temp_pari += (m[j][i] % 2 == 0 ? 1 : 0);
                }
                max_index = (temp_pari > max_pari ? i : max_index);
                max_pari = (temp_pari > max_pari ? temp_pari : max_pari);
            }        
            for (int i = 0; i < m.length; i++) {
                if (m[i][max_index] % 2 == 0) {
                    ll.add(m[i][max_index]);
                }
            }
            return ll;
    }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    26
    andrea, grazie mille. Alla fine mi sono perso in cavolate, come al solito. Il costruttore?cosa scrivo?
    Comunque quando compilo mi riporta la scritta
    Compito.java uses unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.


    Cos'è?ho cercato ma non ho trovato nulla di soddisfacente

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Bhè almeno il costruttore scrivilo tu! Vorrai passargli come parametro la matrice di interi oppure anche niente, visto che comunque il metodo che devi scrivere prende come parametro di ingresso una matrice di interi.

    Comunque, nel mettere insieme il codice, mi sono accorto di aver tralasciato la prima riga - riposto il metodo completo.
    codice:
    public LinkedList colonnaMaxPari(int m[][]) {
            LinkedList ll = new LinkedList();
            int max_index = 0;
            int max_pari = 0;
            for (int i = 0; i < m[0].length; i++) {
                int temp_pari = 0;
                for (int j = 0; j < m.length; j++) {
                    temp_pari += (m[j][i] % 2 == 0 ? 1 : 0);
                }
                max_index = (temp_pari > max_pari ? i : max_index);
                max_pari = (temp_pari > max_pari ? temp_pari : max_pari);
            }        
            for (int i = 0; i < m.length; i++) {
                if (m[i][max_index] % 2 == 0) {
                    ll.add(m[i][max_index]);
                }
            }
            return ll;
    }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  8. #8
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Ti ha già risposto in esteso Andrea1979, quindi non mi dilungo ulteriormente sull'algoritmo risolutivo.
    Scrivo solo segnalarti che il messaggio di warning che ricevi (quello relativo alle "unsafe or unchecked operations") fa riferimento all'oggetto LinkedList ed ha a che fare con una cosa chiamata "Generics". In realtà puoi tranquillamente ignorarlo (soprattutto se sei alle prime armi), ma se vuoi approfondire la funzionalità ti posso segnalare i links:

    http://it.wikipedia.org/wiki/Generics_Java
    http://java.html.it/guide/lezione/3972/java-generics/
    http://download.oracle.com/javase/1..../generics.html

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.