2011-10-29 3 views
0

Je suis dans une classe Java débutant. Ce laboratoire est pour moi de faire un "portefeuille" de classe qui manipule un tableau qui représente un portefeuille. Wallet contient le tableau "contents []" pour stocker les entiers représentant la monnaie papier. La variable "count" contient le nombre de billets dans un portefeuille. Après avoir écrit des méthodes (qui correspondent aux appels de méthode fournis dans une classe Serpate Driver) pour initialiser le Wallet et ajouter un compte de devise/mise à jour, j'ai besoin de transférer le tableau d'un Wallet instancié à un autre. Je ne sais pas comment cela fonctionnerait parce que la classe Wallet n'a joué qu'avec un portefeuille appelé "myWallet" et maintenant je dois prendre un nouveau Wallet appelé "yourWallet" et le remplir avec les valeurs du tableau "myWallet". // Je dois souligner que l'aide de la bibliothèque API Java n'est pas autorisé dans ce coursParamètre de tableau passant

Ma classe de portefeuille ressemble à ceci jusqu'à présent:

public class Wallet 
{ 
    // max possible # of banknotes in a wallet 
    private static final int MAX = 10; 

    private int contents[]; 
    private int count;  // count # of banknotes stored in contents[] 

    public Wallet() 
    { 
     contents = new int[MAX]; 
     count = 0; 
    } 

    /** Adds a banknote to the end of a wallet. */ 
    public void addBanknote(int banknoteType) 
    { 
     contents[count] = banknoteType; 
     count = count + 1; 
    } 

    /** 
    * Transfers the contents of one wallet to the end of another. Empties the  donor wallet. 
    */ 
    public void transfer(Wallet donor) 
    { 
     //my code belongs here 
    } 

...

Le look de code du pilote comme ceci:

public class Driver 
{ 
    public static void main(String args[]) 
    { 
     Wallet myWallet = new Wallet(); 

     myWallet.addBanknote(5); 
     myWallet.addBanknote(50); 
     myWallet.addBanknote(10); 
     myWallet.addBanknote(5); 

     System.out.println("myWallet contains: " + myWallet.toString()); 

     // transfer all the banknotes from myWallet to yourWallet 
     Wallet yourWallet = new Wallet(); 
     yourWallet.addBanknote(1); 
     yourWallet.transfer(myWallet); 
     System.out.println("\nnow myWallet contains: " 
               + myWallet.toString()); 
     System.out.println("yourWallet contains: " 
               + yourWallet.toString()); 

Je veux utiliser addBanknote() pour aider, mais je ne sais pas comment dire la méthode transfert() pour transférer tous myWallet dans yourWallet .

J'ai eu l'idée de faire somethign comme celui-ci dans le transfert():

yourWallet.addBanknote(myWallet.contents[i]); 

avec un traversal i augmenter pour les contenus myWallet. Cela semble horriblement faux, mais je suis complètement perdu pour écrire cette méthode. Si mon problème est si flou que personne ne peut aider, je serais plus qu'heureux de recevoir des conseils sur la façon de poser une meilleure question ou sur la façon de rechercher avec des termes corrects. Merci pour toute aide que vous pouvez fournir.

Répondre

0

Je pense que la question est bonne et je pense que vous êtes sur la bonne voie. La façon dont vous appelez Wallet#addBanknote(int) est correcte. Ce que vous avez dit est la bonne chose:

public void transfer(Wallet donor) 
{ 
    // Traverse the donor's wallet 
     // Add the bank note from the donor to this wallet 
     // What do you think also needs to happen to make sure 
     // the donor is actually giving their bank note? 
} 

Juste une autre chose, ce qui se passerait dans votre méthode Wallet#addBanknote(int) si vous avez plus de contenu que le MAX?

+1

Je pense que _transfer (donateur de portefeuille) _ signifie «transférer toutes les notes du donateur à moi». _tranfer (donneur de Waller, int bankNoteType) _ signifierait 'transférer 1 seule note du type donné du donneur à moi'. Et personnellement, j'aurais choisi _transferTo (récepteur Waller) _ comme donnant de l'argent se sent plus naturel dans un api que de le prendre :) – extraneon

+0

@extraneon Je pense que ce sont de bonnes questions et préoccupations pour l'OP. J'étais sous l'hypothèse (peut-être incorrectement) qu'on leur a donné une sorte de gabarit et que je devais le remplir. Je ne vois pas ce que vous pensez de 'bankNoteType', car les billets de banque ne sont que la valeur du billet de banque (sauf si je Je me trompe). Donc, le contenu serait comme: '[1, 5, 20, 20, 100]'. – mangoDrunk

+0

@mangoDrunk Que fait le '#' dans la dernière ligne que vous avez écrite? Vous avez raison à propos du modèle de portefeuille avec des méthodes manquantes et que les tableaux en question ne sont que des valeurs int. Aussi, extraneon Merci d'avoir expliqué l'appel de méthode! C'était (et c'est toujours) l'une des parties les plus floues de mon problème. Comment s'appelle-t-il? Paramètres de la méthode ou existe-t-il un meilleur nom? – DiscipleApollos

0

Le myWallet dans la méthode de transfert est nommé « donneur », et avec cela, il ne semble pas terriblement mal:

addBanknote (donor.contents [i]); 

Vous avez juste besoin d'une boucle autour d'elle, et de supprimer le yourWallet. qui est le nom d'une instance de cette classe. Cette instance est à l'intérieur de la classe/méthode this, mais n'a pas besoin d'être spécifiée, car il n'existe aucune autre méthode addBanknote dans la portée, ce qui pourrait être voulu. (Merci à mangoDrunk).

+0

'yourWallet' devrait également être' this' ou supprimé. – mangoDrunk

+0

Oh oui, vous avez raison. –

1

Je ne veux pas gâcher vos devoirs comme vous semblez aller dans le bon sens, mais j'ai des commentaires que vous pouvez soit prendre ou non :)

D'abord, je serais probablement mis la banque notez les types dans une énumération.Mais comme cela semble un peu à avancé, pensez

public class Wallet { 
    public static final int ONE_DOLLAR_BILL = 1; 
    public static final int FIVE_DOLLAR_BILL = 5; 
    ... 

    // looks a bit more readable to me 
    myWallet.addBanknote(ONE_DOLLAR_BILL); 

Transfert tous les billets du donneur pour vous ne doit pas être tellement d'un problème (une boucle ferait) mais je pense que vous êtes dans un monde de mal si vous essayez de mettre en œuvre un

removeBanknote(int banknoteType); 

que vous utilisez le nombre non seulement comme une longueur, mais aussi comme une variable d'index. J'entends par là que le contenu [0] ... contenu [count-1] contient des billets de banque valides. Et comment en supprimer un sans trop de travail?

Attention: un peu plus avancé

Dans votre cas, je choisirai probablement d'avoir un banknoteType de 0 indiquant une fente de billet vide dans votre portefeuille, et mettre en œuvre _addBanknote (int banknoteType):

public void addBanknote(int banknoteType) { 
    for (int i=0; i < contents.length; i++) { 
     if (contents[i] == 0) { 
      contents[i] = banknoteType; 
      count++; 
      return; // OK inserted banknote at the first empty slot 
     } 
    } 
    throw new RuntimeException("Wallet is full"); 
} 

Cela peut être un peu écrasant à ce stade. Mais il vous permettra de mettre en œuvre:

public void removeBanknote(int banknoteType) { 
    for (int i=0; i < contents.length; i++) { 
     if (contents[i] == banknoteType) { 
      contents[i] = 0; // better: NO_BANKNOTE = 0 
      count--; 
      return; 
     } 
    } 
    throw new RuntimeException("This wallet does not contain a banknote of type " + banknoteType); 
} 

S'il vous plaît noter que dans les deux méthodes que je reviens quand j'ai enlevé avec succès ou ajouté le billet de banque. Seulement quand je n'ai pas pu trouver un emplacement libre, ou le billet demandé, je finis la boucle for et finis par lancer une exception et arrêter ainsi le programme.

0

Vous pouvez créer un constructeur qui prend un autre portefeuille, ou une fonction (comme déjà mentionné) et utiliser System.arraycopy pour copier le tableau d'un seul coup. System.arraycopy est rapide, et c'est vraiment exagéré pour quelque chose de petit comme ça, mais c'est un bon outil à avoir dans votre boîte à outils.

L'autre alternative mentionnée, copier les éléments d'un tableau à l'autre élément par élément dans une boucle fonctionnera bien aussi.

+0

Dans ce cas, je ne pense pas que je suis autorisé à utiliser des méthodes pré-faites. J'écris System.arraycopy pour plus tard tho. Merci pour l'aide! – DiscipleApollos