Weihnachtsbaum: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
(Die Seite wurde neu angelegt: „Kategorie:Java Da viele immer mal wieder einen Weihnachtsbaum erstellen möchten, stelle ich mal meinen vor Wem es hilft, der kann sich gerne bedienen. Viel…“)
 
Zeile 5: Zeile 5:
 
Viel Spaß!
 
Viel Spaß!
  
<nowiki>
+
<code=java>
 
/*
 
/*
 
  * ChristmasTreeTest.java
 
  * ChristmasTreeTest.java
Zeile 88: Zeile 88:
 
   
 
   
 
}
 
}
</nowiki>
+
</code=java>
  
<nowiki>
+
<code=java>
 
/*
 
/*
 
  * ChristmasTree.java
 
  * ChristmasTree.java
Zeile 212: Zeile 212:
 
      
 
      
 
}
 
}
</nowiki>
+
</code=java>

Version vom 7. August 2013, 15:52 Uhr


Da viele immer mal wieder einen Weihnachtsbaum erstellen möchten, stelle ich mal meinen vor Wem es hilft, der kann sich gerne bedienen.

Viel Spaß!

<code=java> /*

* ChristmasTreeTest.java
*
* 05.01.2012
*
* Copyright 2012 fastjack
*/

package blog.tree;

import org.junit.*;

import static org.junit.Assert.*;

public class ChristmasTreeTest {

   private static final String LINE_END = System.getProperty("line.separator");

   @Test(expected=IllegalArgumentException.class)
   public void failCreateWithNegativeHigh() {
       new ChristmasTree(-1);
   }

   @Test(expected=IllegalArgumentException.class)
   public void failCreateWithZeroHigh() {
       new ChristmasTree(0);
   }

   @Test
   public void shouldCreateWithHighOfOne() {
       StringBuilder expected = new StringBuilder();
       expected.append("*").append(LINE_END);
       expected.append("|").append(LINE_END);
       assertEquals("christmas tree was not correct!", expected.toString(), 
               new ChristmasTree(1).toString());
   }

   @Test
   public void shouldCreateWithHighOfTwo() {
       StringBuilder expected = new StringBuilder();
       expected.append(" * ").append(LINE_END);
       expected.append("***").append(LINE_END);
       expected.append(" | ").append(LINE_END);
       assertEquals("christmas tree was not correct!", expected.toString(), 
               new ChristmasTree(2).toString());
   }

   @Test
   public void shouldCreateWithHighOfThree() {
       StringBuilder expected = new StringBuilder();
       expected.append("  *  ").append(LINE_END);
       expected.append(" *** ").append(LINE_END);
       expected.append("*****").append(LINE_END);
       expected.append("  |  ").append(LINE_END);
       assertEquals("christmas tree was not correct!", expected.toString(), 
               new ChristmasTree(3).toString());
   }

   @Test
   public void shouldCreateWithHighOfFour() {
       StringBuilder expected = new StringBuilder();
       expected.append("   *   ").append(LINE_END);
       expected.append("  ***  ").append(LINE_END); 
       expected.append(" ***** ").append(LINE_END);
       expected.append("*******").append(LINE_END);
       expected.append("   |   ").append(LINE_END);
       assertEquals("christmas tree was not correct!", expected.toString(), 
               new ChristmasTree(4).toString());
   }

   @Test
   public void shouldCreateWithHighOfFive() {
       StringBuilder expected = new StringBuilder();
       expected.append("    *    ").append(LINE_END);
       expected.append("   ***   ").append(LINE_END); 
       expected.append("  *****  ").append(LINE_END);
       expected.append(" ******* ").append(LINE_END);
       expected.append("*********").append(LINE_END);
       expected.append("    |    ").append(LINE_END);
       assertEquals("christmas tree was not correct!", expected.toString(), 
               new ChristmasTree(5).toString());
   }

} </code=java>

<code=java> /*

* ChristmasTree.java
*
* 05.01.2012
*
* Copyright 2012 fastjack
*/

package blog.tree;

import org.apache.commons.lang.*;

/**

* This class defines a christmas tree. After construction the tree can represented as String 
* via the toString() method.
* 

*

 * System.out.println(new ChristmasTree(3).toString());
 * 
* 
* prints out a christmas tree with a height of three in form: 
* 

*

 *   *  
 *  *** 
 * *****
 *   |  
 * 
* 
* the idea for defined height n is
*  

*

 *        // 2n-1 lines for body
 *   *    // for actual row (beginning at zero) r print out 2(r+1)-1 stars
 *  ***   // 
 *  |.|   // if actual column is in star printing area |.| including the | then print a star 
 *  |.|   // otherwise a space 
 * *****  //
 *   |    // and a separate line for the centered trunk
 * 
* 
* @author fastjack
*/

public class ChristmasTree {

   private static final String TRUNK = "|";
   private static final String SPACE = " ";
   private static final String STAR = "*";
   private static final String LINE_END = System.getProperty("line.separator");
   private int height;
   private int maxTreeWidth;
   private int halfOfTreeWidth;
   
   /**
    * Creates a christmas tree for the defined height.
    * 
    * @param height the height of the tree must be greater than zero
    */
   public ChristmasTree(int height) {
       Validate.isTrue(height > 0, "height must be greater than zero!");
       this.height = height;
       maxTreeWidth = 2 * height - 1;
       halfOfTreeWidth = maxTreeWidth / 2;
   }

   @Override
   public String toString() {
       StringBuilder s = new StringBuilder();
       s.append(makeBody());
       s.append(makeBottomLineWithTrunk());
       return s.toString();
   }

   private String makeBody() {
       StringBuilder lines = new StringBuilder();
       for(int row = 0; row < height; row ++) {
           int numberOfStarsInRow = getNumberOfStarsInRow(row);
           int startOfStarPrinting = getStartColumnToPrintStars(numberOfStarsInRow);
           int endOfStarPrinting = startOfStarPrinting + numberOfStarsInRow;
           lines.append(makeLine(startOfStarPrinting, endOfStarPrinting));
       }
       return lines.toString();
   }

   private int getNumberOfStarsInRow(int row) {
       return 2 * (row + 1) - 1;
   }

   private int getStartColumnToPrintStars(int numberOfStarsInRow) {
       return halfOfTreeWidth - (numberOfStarsInRow / 2);
   }

   private StringBuilder makeLine(int startOfStarPrinting, int endOfStarPrinting) {
       StringBuilder line = new StringBuilder();
       for(int column = 0; column < maxTreeWidth; column ++) {
           if (isStarToPrint(startOfStarPrinting, endOfStarPrinting, column)) {
               line.append(STAR);
           } else {
               line.append(SPACE);
           }
       }
       line.append(LINE_END);
       return line;
   }

   private boolean isStarToPrint(int startOfStarPrinting, int endOfStarPrinting, int column) {
       return column >= startOfStarPrinting && column < endOfStarPrinting;
   }

   private String makeBottomLineWithTrunk() {
       StringBuilder bottom = new StringBuilder();
       for(int column = 0; column < maxTreeWidth; column ++) {
           if (column == maxTreeWidth / 2) {
               bottom.append(TRUNK);
           } else {
               bottom.append(SPACE);
           }
       }
       bottom.append(LINE_END);
       return bottom.toString();
   }
   

} </code=java>