Weihnachtsbaum
Aus Byte-Welt Wiki
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>
