2013-10-21 5 views
1

카드 갑판 (ARRAY)을 출력하기 위해 toString 메서드를 구현하는 데 어려움을 겪고 있습니다.카드 배열 toString - Java

가 나는 카드 클래스를 열거 형으로 구현

public class Card { 

    private Rank rank; 
    private Suit suit; 

    public Card(Rank theRank, Suit theSuit) { 
     rank = theRank; 
     suit = theSuit; 
    } 

    public Rank getRank() { 
     return rank; 
    } 

    public Suit getSuit() { 
     return suit; 
    } 

    public String toString() { 
     return (rank + " of " + suit); 
    } 

} 

계급 열거 형

public enum Suit { 
    HEARTS, CLUBS, DIAMONDS, SPADES; 
} 

로 구현

public enum Rank { 

    ACE(1), TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(
      9), TEN(10), JACK(10), QUEEN(10), KING(10); 

    private final int rankValue; 

    private Rank(int value) { 
     rankValue = value; 
    } 

    public int getRankValue() { 
     return rankValue; 
    } 

} 

정장 갑판 클래스

public class Deck { 

    private static Card[] cards = new Card[52]; 

    public Deck() { 
     int i = 0; 
     for (Suit s : Suit.values()) { 
      for (Rank r : Rank.values()) { 
       cards[i++] = new Card(r, s); 

      } 
     } 
    } 

    public Card[] getCards() { 
     return cards; 
    } 

    // toString METHOD NOT WORKING 
    public String toString() { 

     String s = ("The Complete Deck consists of: \n" + getCards()); 

     return s; 

    } 

} 

그리고 (주요 방법 포함) DeckDriver 클래스

public class TestDeck { 

    public static void main(String[] args) { 

     System.out.println("*** DISPLAY A FULL DECK OF CARDS ***\n"); 

     Deck theDeck = new Deck(); 

     Card[] cards = theDeck.getCards(); 

     for (Card c : theDeck.getCards()) { 
      System.out.println(c); 
     } 

     // or 
     System.out.println(""); 
     System.out.println(theDeck.toString()); 

    } 

} 

첫 번째에 println 문 인쇄 아웃으로 원하는,하지만 난이 갑판 클래스의 toString() 메소드를 구현하는 데 필요한거야. 이것은 내가 어려움을 겪고있는 곳입니다. (처음에 println 문의 출력 제외 &) 위의 코드에서

, 나는 점점 오전 출력은 다음과 같습니다

완전한 데크로 구성 [LCard, 2c6f7ce9

어떤 조언을 @ 이 문제를 해결하려면 &을 이해할 수있게하십시오.

감사합니다.

*이 EDIT *

그래서 I는 다음 시도 :

public String toString() { 

    String s = ("The Complete Deck consists of: \n" + Arrays 
      .toString(cards)); 
    return s; 

} 

&이 배열을 출력하지만, 단일에 난 즉, 긴 줄 거라고 w 새 줄에 각 배열 요소를 인쇄하는 방법이 있습니까?

감사합니다.

+0

내 대답을 확인하십시오. 귀하의 요구 사항에 따라 수정했습니다 – Prateek

답변

2

배열의 toString 결과가 표시됩니다. Card 배열의 각 항목을 반복하여 toString 값을 출력해야합니다. 또는 java.util.Arrays의 메서드를 사용할 수 있고 Arrays.toString(getCards());

을 호출 할 수 있습니다. 출력이 마음에 들지 않으면 반복을 수행하고 출력해야합니다 (또는 아파치 공유 또는 구아바 또는 무언가를 사용하여 배열에 가입해야합니다). 멋진, 읽을 수있는 문자열로 값이 같은

뭔가 일을해야

:.

public String toString() { 
    StringBuilder buf = new StringBuilder("The Complete Deck consists of: \n"); 
    for (Card card : getCards()) { 
     buf.append(card.toString()).append("\n"); 
    } 
    return buf.toString(); 
} 

또는 apache StringUtils와 :

public String toString() { 
    return "The Complete Deck consists of: \n" + StringUtils.join(getCards(), "\n"); 
} 
+0

응답 해 주셔서 감사합니다. 당신이 제안하는 방식대로 배열을 반복 할 수있는 방법에 대해 나를 안내 할 수 있습니까? –

+0

많은 감사를드립니다! 아직 StringBuilder에 익숙하지 않지만 조사 할 사항입니다. 감사. –

2

두 가지 옵션이 있습니다.나는 두 번째 선호 :

하나는 getCards() 방법 더 나은

public String getCards(){ 
    return Arrays.deepToString(cards); 
} 

에 당신이 방법) (당신의 된 toString 같은 것을 할 수있는 변경

public String toString() { 

    String s = ("The Complete Deck consists of: \n" + Arrays.deepToString(getCards())); 

    return s; 

} 

Arrays.deeptoString()이하는 일은 배열의 문자열 표현을 제공한다는 것입니다.

업데이트 1 : - 다음은 새 줄에 각 요소를 인쇄하는 코드입니다.

public String toString(int[] arr) { 
     String temp = ""; 
     for (int i : arr) { 
      temp = temp + i + "\n"; 
     } 
     return temp; 
    } 

업데이트 2 : - 나의 첫 번째 업데이트는 당신에게 당신이 새로운 줄에 배열 요소가 문자열을 얻을 수있는 방법에 대한 아이디어를 제공하는 것이었다. 사람들이 내게는 기본적으로

public String toString() { 
      String temp = ""; 
      for (Card c : Cards) { 
       temp = temp + c.toString() + "\n"; 
      } 
      return temp; 
     } 
+0

왜 int 배열입니까? 그리고 상속 된 toString을 재정의하지 않는 이유는 무엇입니까? – sdanzig

+0

다른 행에 배열 요소를 인쇄하는 방법을 보여주는 예입니다. @sdanzig 코드의 제목이 무엇인지 확인하십시오. 그것의 유스 케이스를 진술한다. 그것은 사용자가 원하는 것을 대체하는 것이 아니라 그가 원하는 것을 성취하는 방법입니다. – Prateek

+0

좋아요, 조금 생각해 봐야 겠지만, 왜 인수로 toString을 정의하겠습니까? JavaScript를 배우는 사람이 혼란스러워 할 때 혼란스럽게 생각합니다. 왜냐하면 혼자서 그렇게하려고 시도하면 인자를 전달하기 때문에 거의 항상 의도 인 Object.toString()을 재정의하지 않기 때문입니다. – sdanzig

1

자바의 기본 배열을 구현하지 않는다 "toString()"를 실행 당신이 프로그램에 붙여 얻을 수있는 정확한 코드를 제공 할 것 같다. 루프의 개별적으로 카드의 toStrings()를 추가하고이를 반환하거나 다른 답변에서 제안 된대로 Arrays.toString과 같은 작업을 수행하여 수동으로해야합니다. 별도의 라인에 표시되는 카드를 원하는 경우에

,이 같은 자신의 루프를 구현해야한다 :

public String toString() { 
    String str = ""; 
    for(Card c: cards) { 
     str += c.toString() + "\n"; 
    } 
    return str; 
} 
+0

응답 해 주셔서 감사합니다. 나는 카드 클래스 - 하단/마지막 함수에 toString 메서드가 있습니다. 적어도 그것은 toString()이라는 이름입니다. 내가 '적절한'toString 메서드를 구현하는 방법에 대한 이해가 부족합니까? –

+0

아니, 괜찮 았어, @ user2904978 ... 코드를 다시 포맷했다. 들여 쓰기가 끔찍하게 혼란 스러웠다. 카드를 별도의 줄에 표시하려면 내 솔루션을 참조하십시오. – sdanzig

1

일부가 아닌 String 객체 자바 문자열을 연결하려면 그 non-string 개체의 toSrting() 방법의 결과를 사용 . 따라서 "myString" + someObject.toStrint()과 같습니다. 귀하의 경우에 당신은 Card[] 배열 자바는 해당 배열에 toString()를 호출합니다

"The Complete Deck consists of: \n" + getCards() 

반환 getCards()부터하려고 노력하고 있습니다.
배열은 당신이 toString() 방법을 재정의하고 당신이

  • 한 차원 배열을 의미 [LCard;@2c6f7ce9을보고있다 그래서

    getClass().getName() + "@" + Integer.toHexString(hashCode()) 
    

    을 반환 Object 클래스 버전에서 상속 사용 못하게 [L

  • Card 유형 객체
  • 및 그 hashCode의 16 진수 형식은입니다..

당신이 Arrays.toString(yourArray)를 사용하거나 배열의 모든 요소를 ​​반복하고이를 연결할 수 있습니다 배열 내 요소의 표현됩니다 문자열을 만들려면.

그래서 어쩌면

public String toString() { 
    return "The Complete Deck consists of: \n" + Arrays.toString(getCards()); 
} 

처럼 뭔가 Deck 클래스에 toString() 방법을 변경하거나 새로운 라인에 각 카드를 원하는 경우

public String toString() { 
    StringBuilder sb = new StringBuilder("The Complete Deck consists of: "); 
    sb.append(System.lineSeparator()); 

    for (int i = 0; i < cards.length - 1; i++) { 
     sb.append(cards[i].toString()).append(System.lineSeparator()); 
    } 
    sb.append(cards[cards.length - 1]); 

    return sb.toString(); 
} 
+0

감사합니다. 훨씬 명확합니다. –