Classe Java com ARRAY e FOR

Olá a todos!
Vejamos o código:

Classe 1:


//Card.java
//Classe Card representa uma carta de baralho.
public class Card {
	
	private String face;
	private String suit;
	
	//construtor de dois argumentos inicializa face e naipe da carta
	public Card(String cardFace, String cardSuit)
	{
		face = cardFace;
		suit = cardSuit;
	}
	
	//return
	public String toString()
	{
		return face + "of" + suit;
	}
	

}

Classe 2:

//DeckOfCards.java
//Classe DeckOfCards representa um baralho

import java.util.Random; //import class Random
public class DeckOfCards {
	
	private Card deck[]; //array de objetos Card
	private int currentCard; //indice do proximo Card a ser distribuido
	private final int NUMBER_OF_CARDS = 52; //número constante de Cards
	private Random randomNumbers; //gerador de número aleatório
	
	//start construct
	public DeckOfCards()
	{
		//array one
		String faces[] = {"Ace", "Deuce", "Three", "Four", "Five", "Six",
				          "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"};
		//array second
		String suits[] = {"Hearts", "Diamonds", "Clubs", "Spades"};
		
		deck = new Card[NUMBER_OF_CARDS]; //creates Array of objects Card
		currentCard = 0; //configure currentCard, then the one Card distributed is deck[0]
		randomNumbers = new Random(); //creates generator of numbers random 
		
		//fills pack with objects Card
		for(int count = 0; count < deck.length;count++)
			deck[count] = new Card (faces [count % 13], suits [count / 13]);
		
	}//end of construct
	
	//embaralha as cartas com um algoritmo de uma passagem
	public void shuffle()
	{
		//depois de embaralhar, a distribuição deve iniciar em deck[0] novamente
		currentCard = 0; //reinicializa currentCard
		
		//para cada Card, seleciona outro Card aleatório e os compara
		for(int first=0; first < deck.length; first++)
		{
			//seleciona número aleatório entre 0 e 51
			int second = randomNumbers.nextInt(NUMBER_OF_CARDS);
			
			//compara Card atual com Card aleatoriamente selecionado
			Card temp = deck[first];
			deck[first] = deck[second];
			deck[second] = temp;
		}
	}
	
	//distributes a card
	public Card dealCard()
	{
		//determina se ainda há Cards a serem distribuidos
		if(currentCard < deck.length)
			return deck[currentCard++]; //return Card current on array
		else
			return null; //return null for indicate that all the Cards were distributes
	}
	

}

Classe 3


//DeckOfCardsTest.java
//Application of shuffle and distributed Cards
public class DeckOfCardsTest {
	
	//start program Java
	public static void main(String args[])
	{
		
		//creates myDeckOfCards for have access application
		DeckOfCards myDeckOfCards = new DeckOfCards();
		myDeckOfCards.shuffle(); //puts Cards on order random
		
		//print all the 52 cards on order on that they are distributed
		for(int i = 0; i < 13; i++)
		{
			//distributes and prints 4 Cards
			System.out.printf("%-20s%-%-20s%-%-20s%-%-20s%-\n", myDeckOfCards.dealCard(), myDeckOfCards.dealCard(),
					                                            myDeckOfCards.dealCard(), myDeckOfCards.dealCard());
			
		}
		
	}

}

Bom, não estou consiguindo executar o programa. Aparece o seguinte erro:


Exception in thread "main" java.util.MissingFormatWidthException: -%
	at java.util.Formatter$FormatSpecifier.checkText(Formatter.java:2966)
	at java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2663)
	at java.util.Formatter.parse(Formatter.java:2496)
	at java.util.Formatter.format(Formatter.java:2430)
	at java.io.PrintStream.format(PrintStream.java:937)
	at java.io.PrintStream.printf(PrintStream.java:838)
	at DeckOfCardsTest.main(DeckOfCardsTest.java:17)

Existe uns símbolos que não tem sentido neste trecho

System.out.printf("%-20s% -% -20s% -% -20s% -% -20s%-\n"

Provavelmente seja isto

Olá, drsmachado !
Muito obrigado.
O problema foi resolvido, e consigui executar o programa.
Mas, ainda tenho uma dúvida. É a respeito do FOR com o ARRAY.
Veja:

for(int count = 0; count < deck.length;count++)  
            deck[count] = new Card (faces [count % 13], suits [count / 13]); 

o que é feito aí ?

gera todas as cartas do baralho de forma inteligente.

ele gera todas combinacoes possiveis de suit + face, para gerar cada deck.

sem repetições.

se vc fizer um teste de mesa, perceberá isso…

Olá!
Poderiam me explicar esse código ?

 private Card deck[]; //array de objetos Card 

E porque ele criou 3 classes ?

Por favor, essa variável currentCard se for excluída do construtor de DeckOfOcards.java não faz diferença! Já que ela é desnecessária nesse método, por que foi incluída? Se diz que ela configura currentCard e então cria o primeiro Card distribuído: deck [0]. Estou confuso, man >_<

[quote=hackum]Olá!
Poderiam me explicar esse código ?

 private Card deck[]; //array de objetos Card 

E porque ele criou 3 classes ?[/quote]

Olha, Hackum, devemos “dividir para consquistar”. Criemos então três classes: uma que executa o programa (que contém o método MAIN) e as outras que “são a estrutura” do programa. A classe CARD cria o objeto “CARTA” - uma só. A Classe DeckOfCards cria um baralho - USANDO A CLASSE CARD, Embaralha o conteúdo desse vetor DECK (baralho) cum o método SHUFFLE e ainda sim, distribui as cartas RETORNANDO o conteúdo do vetor deck índice a índice (As cartas).