Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [Java] Dubbi sulle Collection

    Salve a tutti, per esercizo devo implementare un mazzo di carte come Collection. Ho deciso di usare un ArrayList per una serie di motivi, in cui andrò ad inserire le 40 istanze della classe Carta (che ha un valore da 1 a 10 che rappresenta il numero e un'altro da 1 a 4 che rappresenta il seme. Quello che mi chiedevo é se fare una classe con una variabile di istanza del tipo ArrayList o direttamente far ereditare la mia classe da appunto ArrayList. In sintesi quale delle due soluzioni vi sembra la migliore? Grazie

    SOLUZIONE 1:
    codice:
    import java.util.*;
    
    public class DeckCard {
    
        ArrayList deck = new ArrayList();
        final int NSUIT = 4;
        final int NCARD = 10;
    
        DeckCard() {
            for (int suit = 1; suit <= NSUIT; suit++) {
                for (int value = 1; value <= NCARD; value++) {
                    deck.add(new Card(value, suit));
                }
            }
        }
    
        public void shuffle() {
            Collections.shuffle(deck);
        }
    
        public void sort() {
            Collections.sort(deck);
        }
    
        public Object pick() {
            Object retval = deck.get(0);
    
            deck.remove(0);
            return retval;
        }
    
        public boolean insert(Collection cards) {
            return deck.addAll(cards);
        }
        
        public int size(){
            return deck.size();
        }
    
        @Override
        public String toString() {
            ListIterator i = deck.listIterator();
            String retval = "";
    
            while (i.hasNext()) {
                retval += ((Card) i.next()).toString() + "\n";
            }
    
            return retval;
        }
    }
    SOLUZIONE 2:
    codice:
    import java.util.*;
    
    public class DeckCard extends ArrayList{
        
        final int NSUIT = 4;
        final int NCARD = 10;
    
        DeckCard() {
            for (int suit = 1; suit <= NSUIT; suit++) {
                for (int value = 1; value <= NCARD; value++) {
                    add(new Card(value, suit));
                }
            }
        }
    
        public void shuffle() {
            Collections.shuffle(this);
        }
    
        public void sort() {
            Collections.sort(this);
        }
    
        public Object pick() {
            Object retval = get(0);
    
            remove(0);
            return retval;
        }
    
        public boolean insert(Collection cards) {
            return addAll(cards);
        }
        
        @Override
        public String toString() {
            ListIterator i = listIterator();
            String retval = "";
    
            while (i.hasNext()) {
                retval += ((Card) i.next()).toString() + "\n";
            }
    
            return retval;
        }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    tenere una classe con dentro un oggetto di tipo List<Carta> :
    non confondere il contenitore con colui che ti dà il contenitore, non ti interessano le funzionalità della lista, non ti interessa essere una lista. Ti interessa avere una lista
    RTFM Read That F*** Manual!!!

  3. #3
    Grazie un'altra piccola cosa: l'istanzazione della lista la faccio all'interno del costruttore o esternamente come ho scritto nel codice? Dovrebbe essere uguale a meno di chiamare di nuovo il costruttore giusto? E comunque in quel caso la vecchia istanza verrebbe eliminata dal gc e resterebbe quella nuova, senza di fatto avere nessun cambiamento. Dico bene?

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    eh?
    Il tuo costruttore deve mantenere la logica necessaria a creare lo stato iniziale del tuo sistema.
    In realtà io metterei la mia classe,
    codice:
    public class GestisciGioco{
       private List<Carta> listaCarte = new ArrayList<Carta>();
    
       public GestisciGioco(){
             init();
       }
    
       private void init(){
               // qui popoli la listaCarte
       }
    }
    finché il tuo oggetto di tipo GestisciScopo è in qualche scope e/o riferito da qualcuno, questo avrà la sua listaCarte valorizzata.
    Init lo sfrutti anche per un eventuale reset
    RTFM Read That F*** Manual!!!

  5. #5
    Il mio dubbio era se fare

    codice:
    public class Deck {
        List deck = new ArrayList();
        
        public Deck(){
            
            // popola..
        }
    }
    oppure

    codice:
    public class Deck {
        List deck;
        
        public Deck(){
            deck = new ArrayList();
            // popola..
        }
    }
    Da quanto ho capito è migliore la prima, no?

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    io preferisco sempre la prima, non che sia migliore
    RTFM Read That F*** Manual!!!

  7. #7
    Ok, grazie mille

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.