2014-06-10 3 views
-2

Card 개체와 Deck 개체가 관련된 Java 프로젝트에서 작업하고 있습니다. 내 덱을 만들었을 때 52 개의 카드가 모두 들어있는 ArrayList가 있습니다. 그러나 컬렉션에서 셔플 메서드를 사용하면 네 개의 Card 객체가 null로 바뀌고 있습니다. Card 클래스는 잘 작동하며 셔플 메서드 이전에 덱을 인쇄하면 52 개의 카드가 모두 있습니다. 일단 카드를 덱에서 섞으면 네 개의 널 (null) 메소드가 생깁니다.컬렉션 Shuffle Method에는 Null 개체가 있습니다.

import java.util.ArrayList; 
import java.util.Collections; 
public class Deck { 
public ArrayList<Card> pack = new ArrayList<Card>(); 
public int spades = 1; 
public int hearts = 1; 
public int diamonds = 1; 
public int clubs = 1; 
public String s = "spades"; 
public String h = "hearts"; 
public String cl = "clubs"; 
public String d = "diamonds"; 
public Deck(){ 

} 
public void makeDeck() 
{ 
    for (int i = 0; i < 14; i++) 
    { 
     Card c = null; 
     if (clubs < 14) 
      c = new Card ("Clubs", clubs); 
      clubs++; 
      pack.add(c); 
     if (spades < 14) 
      c = new Card ("Spades", spades); 
      spades++; 
      pack.add(c); 
     if (hearts < 14) 
      c = new Card ("Hearts", hearts); 
      hearts++; 
      pack.add(c); 
     if (diamonds < 14) 
      c = new Card ("Diamonds", diamonds); 
      diamonds++; 
      pack.add(c); 

    } 
} 

public void showDeck() 
{ 
    for (int i = 0; i < 52; i++) 
    { 
     System.out.println(pack.get(i)); 
    } 
} 

public String CardNumber (int index) 
{ 
    return (pack.get(index).toString()); 
} 

public int Number (int index) 
{ 
    return pack.get(index).CNum(); 
} 

public void Shuffle() 
{ 
    Collections.shuffle(pack); 
} 

}

+7

간단히 말해, if 문 본문 주위에 중괄호가 있어야합니다. 코드의 형식을 지정하는 IDE를 얻으면 현재 가지고있는 것을 볼 수 있습니다. 자바는 파이썬과 같지 않습니다. 블록이 끝나는 곳을 결정하기 위해 공백을 사용하지 않습니다. –

+0

'Collections # suffle'은 여기에 범인이 아닙니다. –

+0

1에서 14까지의 숫자가 13 개 밖에 없습니다. 여기서 셔플을 호출하기 전에 4 개의 'null'값이 추가 된 것을 볼 수 있기 때문에 디버거를 사용하면 도움이됩니다. –

답변

10

귀하의 if -statements 당신은 괄호가 필요 결함이 :

if (clubs < 14) { // <-- 
    c = new Card ("Clubs", clubs); 
    clubs++; 
    pack.add(c); 
} // <-- 

같은이 makeDeck의 다른 if -statements 간다.

Java에서 중괄호를 포함하지 않으면 if 다음에 첫 번째 문만 포함됩니다. 예를 들어

는 : 그것은 if -statement의 본문에 포함됩니다 어떤 결정에 관해서

// 1 
if (condition) 
    A 
    B 

조각 1 AB 전에 공간 관련이없는

// 2 
if (condition) { 
    A 
} 
B 

에 해당 .

0

나는 Collections.shuffle()이 null 요소를 삽입하지 않는다는 것을 절대적으로 보장합니다. 당신이 섞기 전에 그들은 이미 거기에 있어야합니다.

필 루프가 지나치게 복잡하여 결과적으로 고장났습니다. 각 제품군에 대해 카드를 생성하려면 i를 사용하십시오. 다른 대답은 이미 if 문에 무엇이 잘못되었는지 설명했습니다.

String[] suites = new String[] { "Hearts", "Clubs", "Spades", "Diamonds" }; 


for (int i = 0; i < 14; i++) { 
    for (String suite: suites) { 
     pack.add(new Card(suite, i)); 
    } 
} 
+0

@Christian 네, 맞습니다. 방금 내 대답을 업데이 트했습니다. –

+0

@Christian 완료, 감사합니다. –