【问题标题】:How can I reduce the repetiveness in my code?如何减少代码中的重复性?
【发布时间】:2014-11-15 18:32:08
【问题描述】:

看下面的程序:

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

在上面的代码中,我想打印第一组卡片,即梅花,然后以“新套牌顺序”格式对其余的花色执行相同的操作。

梅花 --> 黑桃 --> 红心 --> 方块

我看到第一个 if() 块,即 (cards == 1),有点重复。我不想做 4 个 if 块来做整个套牌。

我的问题如下, 1.我将如何以这种方式减少代码? 2. 可能吗? 要么 3. 是否最好为每套花色做 4 组 if() 块?

提前感谢您的帮助!

【问题讨论】:

    标签: java applet japplet


    【解决方案1】:
    private String[] cards = { "Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"};
    private String[] colors = {"Clubs", "Spades", "Hearts", "Diamonds"};
    

    然后使用 for 循环遍历这两个数组。

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

    【讨论】:

    • 这似乎是解决我的问题的最简约的方法。感谢您的意见!
    【解决方案2】:

    如果您唯一的问题是打印西装,那么我会创建一个数组:

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

    ArrayList&lt;String&gt;()

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

    你可以像这样简单地迭代它:

    for(String suit : suits)
    

    【讨论】:

      【解决方案3】:

      制作它的数组:
      String[] arr = new String[]{"clubs","spades","hearts","diamonds"}
      然后使用循环:
      for(int i=0;i&lt;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
      

      【讨论】:

      • 感谢您的回答,我发现这是最好的方法!
      【解决方案4】:

      创建一个方法printSuit(String suitName) 并在每个if 语句中使用它。

      您还可以创建 Enum 的套装并迭代其值。

      【讨论】:

        【解决方案5】:

        出于算法理解目的:

        如果您有一个带有 X 值的 For 并在每个值的 if 内,则只需删除 forif

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

        【讨论】:

          【解决方案6】:

          使用enum 最好在您的情况下使用额外的功能。
          这是我简化代码的方法。

          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
          }
          

          【讨论】:

            【解决方案7】:

            更面向对象的解决方案是创建一个 Card 类,并将花色和价值提升为枚举类型:

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

            【讨论】:

              【解决方案8】:

              由于java是面向对象的语言,所以尽量考虑对象

              首先创建具有颜色和等级的枚举;

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

              deck 实例化时会创建所有卡片,这对操作卡片很有用

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2022-01-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多