2014-11-15 7 views
1

Посмотрите на следующую программу:Как уменьшить повторяемость кода?

public class HouseOfCards 
{ 
    public static void main(String[] args) 
    { 
     for (int cards = 1; cards <= 4; cards++) 
     { 
      if (cards == 1) 
      { 
       System.out.println("Ace of Clubs"); 
       for (int singles = 2; singles <= 9; singles++) 
       { 
        System.out.println(singles + " of Clubs"); 
       }//end of for loop() 
       System.out.println("Jack of Clubs"); 
       System.out.println("Queen of Clubs"); 
       System.out.println("King of Clubs"); 
       System.out.println("Ace of Clubs"); 
      }//end of if() 
          ...... 
      //More else if() blocks for each suit 
          ...... 
     }//end of for loop() 
    }//end of method main() 
    }//end of class HouseOfCards 

В приведенном выше коде, я хочу, чтобы напечатать первый набор карт, которые являются клубы, а затем сделать то же самое для остальных костюмов в «новом порядке палубе ".

клубов -> Лопата -> Сердце -> Алмазы

Я вижу, что первый, если() блок, что существо, (карты == 1), немного повторов. Я не хочу делать 4 блока, чтобы сделать всю колоду.

Мои вопросы для вас следующие: 1. Как я могу уменьшить код таким образом? 2. Возможно ли это? Или 3. Это просто лучше всего сделать 4 набора блоков if() для каждого костюма?

Заранее благодарим за помощь!

ответ

0

делают массив из него:
String[] arr = new String[]{"clubs","spades","hearts","diamonds"}
затем использовать цикл:
for(int i=0;i<arr.length;i++){} пример:

public class HouseOfCards 
{ 
    private static final String[] arr = new String[]{"Clubs","Spades","Hearts","Diamonds"}; 
    public static void main(String[] args) 
    { 
      for(int i=0;i<arr.length;i++) 
      { 
      System.out.println("Ace of "+arr[i]); 
       for (int singles = 2; singles <= 9; singles++) 
       { 
        System.out.println(singles + " of "+arr[i]); 
       }//end of for loop() 
       System.out.println("Jack of "+arr[i]); 
       System.out.println("Queen of "+arr[i]); 
       System.out.println("King of "+arr[i]); 
       System.out.println("Ace of "+arr[i]); 
      }//end of if() 
    }//end of method main() 
    }//end of class HouseOfCards 
+1

Спасибо за ваш ответ, я нашел, что это лучший способ сделать это! –

0

Создайте метод printSuit(String suitName) и использовать его внутри каждого if заявления.

Вы также можете создать Enum костюмов и перебрать его значения.

2
private String[] cards = { "Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"}; 
private String[] colors = {"Clubs", "Spades", "Hearts", "Diamonds"}; 

Затем итерации через оба массива используются для циклов.

for (int iColor = 0; iColor < colors.length; iColor++) { 
    for (int iCard = 0; iCard < cards.length; iCard++) { 
     System.out.printf("%s of %s%n", cards[iCard], colors[iColor]; 
    } 
} 
+0

+1 для двух массивов – maskacovnik

+0

Это, по-видимому, самый минималистический подход к моей проблеме. Спасибо за ваш вклад! –

1

Если проблема только у вас есть печатает костюм, то я бы либо создать массив:

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

или ArrayList<String>():

ArrayList<String> suits = new ArrayList<String>(); 
suits.add("Clubs"); 
suits.add("Spades"); 
suits.add("Hearts"); 
suits.add("Diamonds"); 

Вы можете просто перебирать его как что:

for(String suit : suits) 
0

Для алгоритма понимания цели:

Если у вас есть For со значениями X и внутри if для каждого значений, чем просто удалить for и if.

for (int cards = 1; cards <= 4; cards++){ 
     if (cards == 1) System.out.println("A"); 
     if (cards == 2) System.out.println("B"); 
     if (cards == 3) System.out.println("C"); 
     if (cards == 4) System.out.println("D"); 
} 

точно так же, как:

System.out.println("A"); 
System.out.println("B"); 
System.out.println("C"); 
System.out.println("D"); 
0

Для использования enum будет лучше в вашем случае с дополнительной функцией.
Вот мой aproach, чтобы сделать ваш код простым.

public static void main(String...args){ 
    for(Card card : Card.values()){ 
     showCards(card); 
    } 
} 
static void showCards(Card card){ 
    for(CardVal cv : CardVal.values()){ 
     System.out.println(cv + " of "+card); 
    } 
} 
static enum Card { 
    Club, 
    Spades, 
    Hearts, 
    Diamond 
} 
static enum CardVal { 
    Ace, 
    Two, 
    Three, 
    Four, 
    Five, 
    Six, 
    Seven, 
    Eight, 
    Nine, 
    Ten, 
    Jack, 
    Queen, 
    King 
} 
0

Более объектно-ориентированное решение было бы создать класс карты, а также содействовать масть и значение перечислимого типа, как, например:

public class Card { 

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

    public enum FaceValue { 
    ACE, 
    KING, 
    QUEEN, 
    JACK, 
    TEN, 
    NINE, 
    EIGHT, 
    SEVEN, 
    SIX, 
    FIVE, 
    FOUR, 
    THREE, 
    TWO, 
    ONE 
    } 

    private Suit suit; 
    private FaceValue value; 

    public Card(Suit suit, FaceValue value) { 
     this.suit = suit; 
     this.value = value; 
    } 

    @Override 
    public String toString() { 
     return value.toString() + " of " + suit.toString(); 
    } 

} 

Тогда вы можете уменьшить свой код печати для двух вложенных циклов :

public static void main(String[] args) { 

    for(Suit s : Suit.values()) { 
     for (FaceValue v : FaceValue.values()) { 
      System.out.println(new Card(s,v)); 
     } 
    } 
} 
0

Как Java является объектно-ориентированным языком, пытается думать объекты

ели st create Enums с цветами и рангом;

enum Colour{ 
     Clubs,Diamonds,Hearts,Spades; 
    } 

    enum Rank{ 
     Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King,Ace 
    } 

Определите вашу карту

class Card{ 
    @Override 
    public String toString() { 
     return rank + " of "+colour; 
    } 
    public Card(Colour colour, Rank rank) { 
     super(); 
     this.colour = colour; 
     this.rank = rank; 
    } 
    private final Colour colour; 
    private final Rank rank; 

} 

это будет хорошо, если ваша карта будет реализует сравнимый интерфейс, а затем, если вы пытаетесь создать любую карточную игру может быть полезным

и наконец, что ты требуется колода

class Deck{ 
    List<Card> cards = new ArrayList<Card>();  
    public Deck(){ 
     for (Colour colour : Colour.values()){ 
      for (Rank rank : Rank.values()){ 
       cards.add(new Card(colour, rank)); 
      } 
     } 
    } 
} 

колода при создании экземпляра создает все карточки, это может быть полезно манипулировать карточками