2011-10-29 5 views
0

초보자 용 Java 클래스입니다. 이 실습실에서는 월렛을 나타내는 배열을 조작하는 클래스 인 '월렛'을 만듭니다. 월렛에는 지폐를 표시하는 정수를 저장하는 "내용 []"배열이 있습니다. 변수 "count"는 지갑의 지폐 수를 유지합니다. 월렛을 초기화하고 통화/업데이트 '개수'를 추가하는 메소드 (serpate Driver 클래스에서 제공된 메소드 호출과 일치하는 메소드)를 작성한 후에는 하나의 인스턴스화 된 월렛 배열을 다른 클래스로 전송해야합니다. 하나의 Wallet 클래스가 "myWallet"이라는 지갑을 망칠 뿐이므로 이제는 "yourWallet"이라는 새 Wallet을 가져 와서 "myWallet"의 배열 값으로 채워야하기 때문에 어떻게 작동하는지 모르겠습니다. 는 // 나는 자바 API 라이브러리를 사용하는이 코스에서 허용되지 않습니다해야배열 매개 변수 전달

내 지갑 클래스는 지금까지 다음과 같습니다

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 
    } 

...

드라이버 코드 외모 이 같은 :

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()); 

나는이에 도움이 addBanknote()를 사용하려면,하지만 난 yourWallet에 myWallet 모두를 전송하는 전송() 메소드를 이야기하는 방법을 모른다 . myWallet 내용에 대한 전을 높이기 위해 탐색과

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

:

나는 이전에 같은 somethign 할 수있는 아이디어를()했다. 그것은 끔찍하게 틀린 것처럼 보이지만, 나는이 방법을 쓰는 데 완전한 손실이 있습니다. 내 문제가 너무 명확하지 않아 아무도 도움을받을 수 없다면 더 나은 질문을하는 방법이나 올바른 용어로 검색하는 방법에 대한 조언을받는 것이 행복 할 것입니다. 제공 할 수있는 도움에 감사드립니다.

답변

0

나는 문제가 잘되고 너가 올바른 길에 있다고 생각한다. Wallet#addBanknote(int)으로 전화하는 방식이 정확합니다. 당신이 MAX보다 더 많은 내용이 있으면 Wallet#addBanknote(int) 방법에 어떤 일이 일어날 것

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? 
} 

그냥 다른 일이 : 당신이 말한 것은 옳은 일입니까? 전송 방법 내부

+1

_transfer (지갑 기증자) _는 '기증자의 모든 메모를 저에게 전 해주세요'를 의미합니다. _tranfer (Waller 기부자, int bankNoteType) _는 '기증자에게서 주어진 유형의 단일 노트를 나에게 전송'을 의미합니다. 개인적으로 나는 _transferTo (Waller 수신기) _를 선택했을 것입니다. 돈을주는 것보다 API에서 더 자연 스럽다고 느낍니다. :) – extraneon

+0

@extraneon 나는 이것이 OP에 대한 좋은 질문이며 걱정거리라고 생각합니다. 나는 어떤 종류의 템플릿을 받았고 그것을 채워야 만한다는 가정하에 (아마도 잘못되었다) 은행 노트는 단지 은행 노트의 가치이기 때문에'bankNoteType'에 대한 당신의 관점을 보지 못했다. '오해'). 따라서 내용은 다음과 같습니다 :'[1, 5, 20, 20, 100]'. – mangoDrunk

+0

@mangoDrunk 마지막 줄에서 '#'은 무엇을합니까? 누락 된 메서드가있는 템플릿 Wallet과 해당 배열이 int 값일뿐입니다. 또한, extraneon 메서드 호출에 대해 설명해 주셔서 감사합니다! 내 문제의 가장 불분명 한 부분 중 하나였습니다. 그게 뭐야? 메서드 매개 변수 또는 더 나은 이름이 있습니까? – DiscipleApollos

0

myWallet은 '기증자'라는 이름, 그리고 그와 함께, 그것은 끔찍하게 잘못 보이지 않는 : 당신은 그냥 주위에 루프를 필요로하고, yourWallet을 제거

addBanknote (donor.contents [i]); 

. 이 클래스의 인스턴스 이름입니다. 이 인스턴스는 클래스/메소드 this에 있지만 범위를 지정하는 다른 addBanknote 메소드가 없기 때문에 지정할 필요는 없습니다. (mangoDrunk에게 감사드립니다).

+0

'yourWallet'도'this'이거나 제거되어야합니다. – mangoDrunk

+0

오 그래, 네 말이 맞아. –

1

난 당신이 올바른 방법 갈 것 같은 숙제를 망치고 싶지 않아,하지만 난 아마 은행을 둘 것입니다, 당신은

먼저 :) 취하거나하지 않을 수 있습니다 중 일부 의견이 수행 일부 열거 형의 노트 유형.그 첨단에 약간 소리를하지만, 문제 (A 할 것 루프)하지만 난 당신이에 있다고 생각 너무 많이하지 않아야 자신에게 기증자의 모든 지폐를 전송

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); 

고려 너비를 인덱스 변수로 사용하고 있기 때문에

removeBanknote(int banknoteType); 

을 구현하려고하면 상처를 입을 수 있습니다. 이것에 의해 당신은 내용 [0] ... 내용 [count-1]이 유효 지폐를 보유하고 있다고 가정합니다. 그리고 너무 많은 일을하지 않고 어떻게 제거하나요?

경고 : 좀 더 고급 귀하의 경우에는

아마 당신의 지갑에 빈 지폐 슬롯을 나타내는 0 banknoteType 있고, 같은 _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"); 
} 

이 시점에서 다소 부담 스러울 수 있습니다. 하지만 다음을 구현할 수 있습니다.

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); 
} 

두 방법 모두 성공적으로 지폐를 제거하거나 추가 할 때 반환됩니다. 무료 슬롯이나 요청 된 은행권을 찾을 수없는 경우에만 for 루프를 완료하고 예외를 던져 결국 프로그램을 중지합니다.

0

다른 지갑을 사용하는 생성자 또는 이미 언급 한 기능을 생성하고 System.arraycopy를 사용하여 하나의 배열을 복사 할 수 있습니다. System.arraycopy는 빠르며, 이와 같이 작은 것에는 확실히 과용이지만 툴킷에 포함 된 좋은 도구입니다.

다른 대안으로, 하나의 배열에서 다른 요소로 루프의 요소별로 요소를 복사해도 괜찮습니다.

+0

이 경우 미리 만들어진 방법을 사용할 수 없다고 생각합니다. 나는 나중에 tho를 위해 System.arraycopy를 쓰고있다. 도와 주셔서 감사합니다! – DiscipleApollos