Search code examples
javaalgorithmmathtapestry

how to draw diamond using tapestry component t:loop


For my homework for Tapestry, I have to show a diamond on table from array of strings. Here's what I have so far:

code Index.java

  public class Index
    {
        @Property
        private Integer number;

        @Property
        private String [] table; 

        public Index() {
            number = 9;
            int temp = 0;

            String tmp = "-";
            table = new String[number * number];

            if(singleCell == null)
                singleCell="";

            for (int i = 0; i <  number; i++) {
                for (int j = 0; j <  number; j++) {
                    table[temp] = tmp;
                    temp++;
                }               
            }
        }

        @OnEvent(component="diamond")
        Object onDiamondLink() {
            String swapValue = "*";

            int  sum = number / 2 ;

            int x1 = number-1;

            int sumY = number / 2;

            int y1 = number+1;

            int temp = x1 + sumY;

            for (int i = 0; i < table.length; i++) {
                table[i] = "-";
            }

            for (int i = 0; i < table.length; i++) {
                if( i == sum) {
                    table[i] = swapValue;
                    sum = sum + x1;
                }
                if ( i == sumY ) {
                    table[i] = swapValue;
                    sumY = sumY + y1;
                } 
            }   

            System.out.println("link diamond is activate");
            return null;
        }
 public boolean isStartRow(){
         return (myIndex%9 ==0);
     }

     public boolean isEndRow(){
         return (myIndex%9 == 8);
     }

     public String getStartTR(){
         return "<tr >";
     }

     public String getEndTR(){
         return "</tr>";
    }

code of index.tml:

<t:actionlink t:id="diamond" >Diamond  table</t:actionlink>
            <br/>



         <h1>Result:</h1>

        <table border="1" >
            <t:loop t:source="table" t:value="singleCell" index="MyIndex">
                <t:if test="startRow">
                 <t:outputraw  value="startTR"/>
                </t:if>
                <td width="20px">
                    ${singleCell}
                </td>
            <t:if test="endRow">
                   <t:outputraw value="endTR"/>
           </t:if> 
            </t:loop>
        </table>

This code generates this output:

-   -   -   -   *   -   -   -   -
-   -   -   *   -   *   -   -   -
-   -   *   -   -   -   *   -   -
-   *   -   -   -   -   -   *   -
*   -   -   -   -   -   -   -   *
-   -   -   -   -   -   -   *   -
*   -   -   -   -   -   *   -   -
-   *   -   -   -   *   -   -   -
-   -   *   -   *   -   -   -   -

The correct output I need is this:

-   -   -   -   *   -   -   -   -
-   -   -   *   -   *   -   -   -
-   -   *   -   -   -   *   -   -
-   *   -   -   -   -   -   *   -
*   -   -   -   -   -   -   -   *
-   *   -   -   -   -   -   *   -
-   -   *   -   -   -   *   -   -
-   -   -   *   -   *   -   -   -
-   -   -   -   *   -   -   -   -

Any ideas will be great help.


Solution

  • Wanna draw a diamond? Try this algorithm:

    public class Diamond {
    
        @Property
        @Persist
        private String diamond;
    
    
        @SetupRender    
        init(){
             int n,i,j,k;
    
         do {  
    
          n = (int)(Math.random() * 10 + 3); 
    
          }while(n % 2 == 0);
    
          diamond += ""+n+"<br\/>";
    
          System.out.println();   
    
         for (i = 1; i <= n; i++){
    
            for (k = n; k > i; k--)
              diamond += "-";
    
            for (j =1; j <= i; j++)
                 diamond += "*"+"-";
    
    
           diamond += "<br\/>";
    
            }
    
         for (i = n; i > 0; i--){
    
            for (k = n; k > i; k--)
              diamond += "-";
    
            for (j =1; j <= i; j++)
                   diamond += "*"+"-";
    
                  diamond += "<br\/>";
    
            }
    }
    }
    

    UPDATE

    Wait a second, you want to create A tapestry page, that draws that diamond of asterisk right?

    One option would be using:

    <t:outputraw value="${diamond}"/>
    

    You just need to set that String the .java part of your page.(See the above code was updated)

    Your output need to be rendered as html, you can just use the algorithms we gave you and insert html breaks instead of println()