Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Stampa elenco

  1. #1

    Stampa elenco

    Ciao a tutti. Sono agli inizi e sto cercando di stampare una tabella in java, tipo il seguente:

    frutta colore
    -----------------
    1 mela gialla
    2 arancia arancione
    3 mela rossa

    il codice è il seguente:

    codice:
     
    public class C {
    	private Object x[][];
    	private a contenitore[];
    	private int righe;
    	c(){
    		x=new Object[2][2];
    		/*inizializzo a*/
    		contenitore=new a[2];
    		righe=4;
    		
    		/*frutta*/
    		String fruttaSet[]=new String[2];
    		fruttaSet[0]="Mela";
    		fruttaSet[1]="Arancia";
    		contenitore[0]=new b("Frutta",0,fruttaSet);
    		
    		/*colore*/
    		String coloreSet[]=new String[3];
    		coloreSet[0]="Giallo";
    		coloreSet[1]="Arancione";
    		coloreSet[2]="Rossa";
    		contenitore[1]=new b("Colore",1,coloreSet);
    		
    		
    		
    	}
    	
    	/*ritorna numero di righe*/
    	int esempiSet(){
    		return righe;
    	}
    	
    	/*ritorna numero di colonne*/
    	int contenitoreSet(){
    		return contenitore.length;
    	}
    	
    	/*ritorna contenitore*/
    	a[] getA(){
    		return contenitore;
    	}
    	
    	
    	Object getRiga(int i,int j){
    		return x[i][j];
    	}
    	
    	/*stampa a video tabella*/
    	public String toString(){
    		/*??*/
    		return contenitore[0].getIndex()+" "+contenitore[0].getName()+" "+(b)contenitore[0].getValue(1);
    		/*Errore: The method getValue(int) is undefined for the type a*/
                    /*ho fatto il cast quindi perchè non funziona?*/
    	}
    	
    	public static void main(String args[]){
    		c s=new c();
    		System.out.println(s);
    	}
    }

    Qui la classe A:
    codice:
     
    public class A {
    	private int i;
    	private String n;
    	/*costruttore*/
    	a(int index,String name){
    		 this.i=index;
    		 this.n=name;
    	}
    	/*restituisce nome*/
    	public String getName(){
    		return n;
    	}
    	/*restituisce l'indice*/
    	public int getIndex(){
    		return i;
    	}
    	
    }
    Qui la classe B:
    codice:
    public class B extends A{
    	private String value[];
    	b(String n,int i,String value[]){
    		super(i,n);
    		this.value=value;
    	}
    	/*restituisce il valore*/
    	String getValue(int i){
    		return value[i];
    	}
    	
    	/*restituisce i numeri di valore*/
    	int getNumber(){
    		return value.length;
    	}
    }

    Mi sono bloccato da 2 giorni a toString e all'inizializzazione della matrice x. Voi come mi consigliate di procedere? Grazie mille a tutti

  2. #2
    Mi sono accorto ora di aver saltato una parentesi l'ho corretto, il problema è si puo' inizializzare la matrice x con tutte le righe per poi fargli stampare tutta la tabella in una sola volta con toString?
    codice:
    public String toString(){
    		/*??*/
    		return contenitore[0].getIndex()+" "+contenitore[0].getName()+" "+((b)contenitore[0]).getValue(1);
    		
    	}

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ti chiedo innanzitutto cosa rappresentano A e B?
    Bisogna sempre dare dei nomi significativi a classi e variabili, quando meno per capire noi stessi dopo 2 ore quello di cui stiamo parlando.

    Poi sbagli a modellare la classe, non so come è la specifica del tuo compito, ma in realtà devi avere una classe siffatta

    Codice PHP:

    public class Elementi{
       private 
    String nomeFrutto
       private 
    String colore


    e utilizzare una struttura come un array o una semplice lista per memorizzare i dati (non array doppi).

    Quando devi stampare a video, prendi oggetti per oggetto e fai il toString() sull'elemento.
    Le matrici sono da usare come ultima alternativa, perché non sono di facile gestione
    RTFM Read That F*** Manual!!!

  4. #4
    La classe A deve restituire il nome dell'Attributo ovvero "Frutta" oppure "Colore" e il numero dell'attributo quindi Frutta 0 e Colore 1, mentre la classe B che oltre a estendere A, restituisce il valore del Colore oppure di Frutto, per esempio Frutta puo' restituire "Mela", "Arancia" o "Uva", mentre Colore restituisce "Rosso", "Giallo", "Verde" ecc...
    Il compito era anche sull'utilizzo delle matrici, ed è li che mi sono bloccato non sapevo come stamparle con toString o come inserirci all'interno i valori.

  5. #5
    Ho provato a fare un ciclo for per metterci all'interno della matrice i valori, ma mi da errore, dove sbaglio?:

    codice:
    for(int i=0;i<esempiSet();i++){
    			for(int j=0;j<contenitoreSet();j++){
    			x[i][j]=((b)contenitore[i]).getValue((int)Math.random()*((b)contenitore[i]).getNumber());
    			}
    /* ERRORE:
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
    	at c.<init>(c.java:28)
    	at c.main(c.java:61)
    */

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Ripartiamo da capo.
    Primo: la gerarchia ti è imposta? Mi spieghi la logica della gerarchia?
    Secondo: cosa dovrebbe contenere l'elemento (i,j) della tua tabella? Fermo restando che da quanto ho capito le matrici servono solo a farti sbagliare
    Terzo: impara a leggere l'eccezione, ti sta chiaramente indicando che provi ad accedere ad una posizione invalida. Non so con quale logica poi immetti gli elementi in matrice (quanto sono grandi ecc ecc)
    RTFM Read That F*** Manual!!!

  7. #7
    Grazie mille!!! Funziona!!!

    In ogni caso:
    Si la gerarchia mi è stata detta di farla così. La classe A modella l'entità attributo ed è la superclasse e contiene i metodi indice e nome, B estende la classe A e rappresenta un attributo discreto quindi eredita i metodi nome e indice e contiene in più metodi valore e lunghezza valore, la classe C contiene le tuple, ha una matrice x e ha i metodi dimensione riga,dimensione contenitore che contiene le tuple, il main.
    Per quanto riguarda (i,j), i accede alle righe, mentre j deve accedere alle colonne della tabella.
    Ci devo salvare dentro nella colonna Frutta quindi alla colonna 0 riga 0 "Mela" nella colonna 0 riga 1 "Arancia" ecc.. poi nella colonna dei Colori colonna 1 riga 0 "Giallo", "Rosso" ecc..

    Comunque ho rivisto il codice e ho corretto degli errori e funziona sono riuscito a salvare gli attributi nella tabella e a stamparlo a schermo, lo reinserisco qui:

    codice:
    x[0][0]=new String(contenitore[0].getName());/*Inserisco "Frutta" all'inizio della matrice*/
    x[0][1]=new String(contenitore[1].getName());/*Inserisco "Colore" all'inizio della matrice*/
    			for(int i=1;i<x.length;i++){
    				for(int j=0;j<x[0].length;j++){
    					int rand=(int)(Math.random()*(((b)contenitore[j]).getNumber())); /*stampo in modo casuale i colori e i frutti*/
    					x[i][j]=new String(((b)contenitore[j]).getValue(rand));
    					
    					}
    Per stampare la stringa ho fatto così:

    codice:
    public String toString(){
    		String s=new String();
    		
    		for(int i=0;i<x.length;i++){
    			for(int j=0;j<x[0].length;j++){
    				s=s+" "+x[i][j].toString();
    			}
    			s=s+"\n";
    		}
    		return s;
    		
    	}
    cosa ne pensi? Funziona però mi sembra incasinato o sbaglio , c'è qualcosa che posso semplificare secondo te?

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    guarda io quando sento parlare di array doppi (matrici e altro) mi scatta subito l'orticaria (è una reazione alquanto incontrollabile). come ti dicevo, matrici (in qualsiasi linguaggio) per me sono la soluzione del "non esiste altro modo per fare quello che devo fare".

    Ma le consegne sono quelle, è un altro paio di maniche.

    Detto questo, ci sono degli errorini (direi finezze che acquisisci con l'esperienza) in questo metodo. Non so quanto sai di string, ma se devi fare una roba del genere e devi farla spesso sappi che con il metodo seguente stai uccidendo la memoria!!!

    Codice PHP:
    public String toString(){
            
    String s=new String();
            
            for(
    int i=0;i<x.length;i++){
                for(
    int j=0;j<x[0].length;j++){
                    
    s=s+" "+x[i][j].toString();
                }
                
    s=s+"\n";
            }
            return 
    s;
            
        } 
    in genere quando si prevede che ci sia un ciclo in cui fai tanti append di stringhe, utilizzi uno StringBuffer (o StringBuilder), guarda le API.


    Codice PHP:
    public String toString(){
            
    StringBuilder build=new StringBuilder();
            
            for(
    int i=0;i<x.length;i++){
                for(
    int j=0;j<x[0].length;j++){
                                    
    build.append(x[i][j].toString()); 
                                    
    build.append(" "); 
                }
                            
    build.append("\n");
            }
            return 
    build.toString();
            
        } 
    ed è già una.

    Poi x[i][j] che tipo è? cosa è? Dai nomi significativi a tutte le classi e a tutte le variabili.
    Codice PHP:
    x[0][1]=new String(contenitore[1].getName()); 
    name è già una stringa, perché fai new String? In pratica con quell'operazione hai duplicato le stringhe in memoria.

    Codice PHP:
    int rand=(int)(Math.random()*(((b)contenitore[j]).getNumber())); /*stampo in modo casuale i colori e i frutti*/ 
    sei sicuro che rand corrisponda ad un numero presente nel contenitore? in realtà potrei avere anche dei null qui, cosa che non controlli.

    Ti consiglio di rivedere bene le stringhe e la gestione delle stesse
    RTFM Read That F*** Manual!!!

  9. #9
    Grazie mille! la tua spiegazione è stata molto chiara , l'unica cosa che non ho capito è perchè dovrebbe avere dei null rand()? Forse ho capito male, ma non mi interessa la dimensione del contenitore[], ma quella di fruttaSet[] oppure coloreSet[] contenuta nel contenitore, in modo che venga generato in modo casuale uno degli attributi contenuti di fruttaSet[] "Mela" o "Arancia" e di colorSet[] "Rosso", "Arancione" o "Giallo".
    Per quanto riguarda x è di tipo Object ed è la matrice che deve contenere i valori di tipo String.

  10. #10
    Forse ho capito, intendevi così:

    codice:
    int c;
    		    Random rand=new Random();
    			for(int i=1;i<x.length;i++){
    				for(int j=0;j<x[0].length;j++){
    					c=rand.nextInt(((b)contenitore[j]).getNumber());
    					x[i][j]=(((b)contenitore[j]).getValue(c));
    					
    					}
    					
    				}

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.