You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@velocity.apache.org by "Leyzerzon, Simeon G" <Si...@gs.com> on 2003/02/27 19:45:10 UTC

order of the insertion

Is it possible to retain the order in which elements where inserted into a
map while this 
map is being rendered by Velocity using #foreach?
I'm using LinkedHashMap when building the context, but it is displayed in
different order.
Here is the code:

Hashtable branchesMap = new Hashtable();

            ArrayList branchData = null;

			Map row = null;

			branchData = new ArrayList();
            row = new LinkedHashMap();

            	row.put("loan_number","12384");			//column 1
            	row.put("borrower_first_name", "dobrinya");//column 2
            	row.put("borrower_last_name", "nikitich");//column 3
            	branchData.add(row); //add row to array list


            row = new LinkedHashMap();
            	row.put("loan_number","85725");			  //column 1
			   	row.put("borrower_first_name",
"vasilisa");//column 2
			   	row.put("borrower_last_name",
"premudraya");//column 3
            	branchData.add(row); //add row to array list

            row = new LinkedHashMap();
            	row.put("loan_number","37271");			  //column 1
            	row.put("borrower_first_name", "solovei");//column 2
            	row.put("borrower_last_name", "razboinik");//column 3
            	branchData.add(row); //add row to array list

            row = new LinkedHashMap();
            	row.put("loan_number","38247");			  //column 1
            	row.put("borrower_first_name", "devitza");//column 2
            	row.put("borrower_last_name", "krasa");//column 3
            	branchData.add(row); //add row to array list


            row = new LinkedHashMap();
            	row.put("loan_number","96441");			  //column 1
            	row.put("borrower_first_name", "kashei");//column 2
            	row.put("borrower_last_name", "bessmertniy");//column 3
            	branchData.add(row); //add row to array list

            
            branchesMap.put("59753",branchData); //add branch data to
branchesMap

			

            branchData = new ArrayList();

			row = new LinkedHashMap();
			      row.put("loan_number","72821");
//column 1
			      row.put("borrower_first_name",
"nikita");//column 2
			      row.put("borrower_last_name",
"khrushev");//column 3
			      branchData.add(row); //add row to array list

			row = new LinkedHashMap();
			      row.put("loan_number","71198");
//column 1
				  row.put("borrower_first_name",
"nadezhda");//column 2
				  row.put("borrower_last_name",
"beskozirkina");//column 3
			      branchData.add(row); //add row to array list

			row = new LinkedHashMap();
			      row.put("loan_number","15742");
//column 1
			      row.put("borrower_first_name",
"andrei");//column 2
			      row.put("borrower_last_name",
"volkonskiy");//column 3
			      branchData.add(row); //add row to array list

			row = new LinkedHashMap();
			      row.put("loan_number","82459");
//column 1
			      row.put("borrower_first_name",
"maria");//column 2
			      row.put("borrower_last_name",
"stuart");//column 3
			      branchData.add(row); //add row to array list


			row = new LinkedHashMap();
			      row.put("loan_number","58231");
//column 1
			      row.put("borrower_first_name",
"hector");//column 2
			      row.put("borrower_last_name",
"berlioz");//column 3
			      branchData.add(row); //add row to array list


            branchesMap.put("59825",branchData); 
	context.put("branches", branchesMap);

The output:

khrushev~72821~nikita~
beskozirkina~71198~nadezhda~
volkonskiy~15742~andrei~
stuart~82459~maria~
berlioz~58231~hector~
nikitich~12384~dobrinya~
premudraya~85725~vasilisa~
razboinik~37271~solovei~
krasa~38247~devitza~
bessmertniy~96441~kashei~

The desired output:

72821~nikita~khrushev~
71198~nadezhda~beskozirkina~
15742~andrei~volkonskiy~
82459~maria~stuart~
58231~hector~berlioz~
12384~dobrinya~nikitich~
85725~vasilisa~premudraya~
37271~solovei~razboinik~
38247~devitza~krasa~
96441~kashei~bessmertniy~

Thanks.
Simeon

---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-user-help@jakarta.apache.org


Re: order of the insertion

Posted by Simon Christian <si...@stoutstick.com>.
Hi Simeon,

It's a little difficult to see what's going on currently without the 
velocity template contents,  but there's a few ways to achieve what 
you're after.

The most explicit method would be to create Branch and Loan classes, and 
populate ArrayLists and Maps of some sort e.g.:

------------- rough code for classes ------------------
public class Branch {

   private String id;

   public Branch( String _id ) {
     id = _id;
   }

   public String getId() {
     return id;
   }
}


public class Loan {

   private String id;
   private String firstname;
   private String lastname;

   public Loan( String _id, String _fname, String _lname ) {
     id = _id;
     firstname = _fname;
     lastname = _lname;
   }

   public String getId() {
     return id;
   }

   public String getFirstname() {
     return firstname;
   }

   public String getLastname() {
     return lastname;
   }
}

------------- rough code for populating context ------------------

ArrayList branches = new ArrayList();
HashMap branch_loan_map = new HashMap();

Branch branch1 = new Branch( "59753" );
ArrayList loans1 = new ArrayList( 5 );
loans1.add( new Loan( "12384",  "dobrinya", "nikitich" ) );
loans1.add( new Loan( "85725",  "vasilisa", "premudraya" ) );
loans1.add( new Loan( "37271",  "solovei", "razboinik" ) );

branches.add( branch1 );
branch_loan_map.put( branch1, loans1 );

// add the remaining branches and loans
// this process would normally be an iteration over a ResultSet
// or similar

context.put( "branches", branches );
context.put( "branche_loan_map", branch_loan_map);

-------------------- template chunk --------------------------

#foreach( $branch in $branches )
#set( $loans = $branch_loan_map.get( $branch ) )
Branch: $branch.Id

#foreach( $loan in $loans )
${loan.Id}~${loan.Firstname}~${loan.Lastname}
#end
#end

--------------------------------------------------------------

I frequently display information like this, and it works very nicely,

HTH

- simon


Leyzerzon, Simeon G wrote:
> Is it possible to retain the order in which elements where inserted into a
> map while this 
> map is being rendered by Velocity using #foreach?
> I'm using LinkedHashMap when building the context, but it is displayed in
> different order.
> Here is the code:
> 
> Hashtable branchesMap = new Hashtable();
> 
>             ArrayList branchData = null;
> 
> 			Map row = null;
> 
> 			branchData = new ArrayList();
>             row = new LinkedHashMap();
> 
>             	row.put("loan_number","12384");			//column 1
>             	row.put("borrower_first_name", "dobrinya");//column 2
>             	row.put("borrower_last_name", "nikitich");//column 3
>             	branchData.add(row); //add row to array list
> 
> 
>             row = new LinkedHashMap();
>             	row.put("loan_number","85725");			  //column 1
> 			   	row.put("borrower_first_name",
> "vasilisa");//column 2
> 			   	row.put("borrower_last_name",
> "premudraya");//column 3
>             	branchData.add(row); //add row to array list
> 
>             row = new LinkedHashMap();
>             	row.put("loan_number","37271");			  //column 1
>             	row.put("borrower_first_name", "solovei");//column 2
>             	row.put("borrower_last_name", "razboinik");//column 3
>             	branchData.add(row); //add row to array list
> 
>             row = new LinkedHashMap();
>             	row.put("loan_number","38247");			  //column 1
>             	row.put("borrower_first_name", "devitza");//column 2
>             	row.put("borrower_last_name", "krasa");//column 3
>             	branchData.add(row); //add row to array list
> 
> 
>             row = new LinkedHashMap();
>             	row.put("loan_number","96441");			  //column 1
>             	row.put("borrower_first_name", "kashei");//column 2
>             	row.put("borrower_last_name", "bessmertniy");//column 3
>             	branchData.add(row); //add row to array list
> 
>             
>             branchesMap.put("59753",branchData); //add branch data to
> branchesMap
> 
> 			
> 
>             branchData = new ArrayList();
> 
> 			row = new LinkedHashMap();
> 			      row.put("loan_number","72821");
> //column 1
> 			      row.put("borrower_first_name",
> "nikita");//column 2
> 			      row.put("borrower_last_name",
> "khrushev");//column 3
> 			      branchData.add(row); //add row to array list
> 
> 			row = new LinkedHashMap();
> 			      row.put("loan_number","71198");
> //column 1
> 				  row.put("borrower_first_name",
> "nadezhda");//column 2
> 				  row.put("borrower_last_name",
> "beskozirkina");//column 3
> 			      branchData.add(row); //add row to array list
> 
> 			row = new LinkedHashMap();
> 			      row.put("loan_number","15742");
> //column 1
> 			      row.put("borrower_first_name",
> "andrei");//column 2
> 			      row.put("borrower_last_name",
> "volkonskiy");//column 3
> 			      branchData.add(row); //add row to array list
> 
> 			row = new LinkedHashMap();
> 			      row.put("loan_number","82459");
> //column 1
> 			      row.put("borrower_first_name",
> "maria");//column 2
> 			      row.put("borrower_last_name",
> "stuart");//column 3
> 			      branchData.add(row); //add row to array list
> 
> 
> 			row = new LinkedHashMap();
> 			      row.put("loan_number","58231");
> //column 1
> 			      row.put("borrower_first_name",
> "hector");//column 2
> 			      row.put("borrower_last_name",
> "berlioz");//column 3
> 			      branchData.add(row); //add row to array list
> 
> 
>             branchesMap.put("59825",branchData); 
> 	context.put("branches", branchesMap);
> 
> The output:
> 
> khrushev~72821~nikita~
> beskozirkina~71198~nadezhda~
> volkonskiy~15742~andrei~
> stuart~82459~maria~
> berlioz~58231~hector~
> nikitich~12384~dobrinya~
> premudraya~85725~vasilisa~
> razboinik~37271~solovei~
> krasa~38247~devitza~
> bessmertniy~96441~kashei~
> 
> The desired output:
> 
> 72821~nikita~khrushev~
> 71198~nadezhda~beskozirkina~
> 15742~andrei~volkonskiy~
> 82459~maria~stuart~
> 58231~hector~berlioz~
> 12384~dobrinya~nikitich~
> 85725~vasilisa~premudraya~
> 37271~solovei~razboinik~
> 38247~devitza~krasa~
> 96441~kashei~bessmertniy~
> 
> Thanks.
> Simeon
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: velocity-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: velocity-user-help@jakarta.apache.org
> 



---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-user-help@jakarta.apache.org


RE: order of the insertion - works for me

Posted by Tim Colson <tc...@cisco.com>.
> Is it possible to retain the order in which elements where
> inserted into a map while this 
> map is being rendered by Velocity using #foreach?

I was about to jump in and say "no" as maps don't have order....but then
read a little further....

> I'm using LinkedHashMap when building the context, 

Seems LinkedHashMap is new in JDK 1.4 and is supposed to maintain the
order of insertion.
http://java.sun.com/j2se/1.4/docs/api/java/util/LinkedHashMap.html

Cool and Interesting. 

I tried it out and it worked fine for me. :-)

Code/template/output below, using 
Velocity 1.3 released 
JSDK 1.4.1 on Winbloze XP 
and the VelocityViewServlet.

Cheers,
Timo


// TESTING CODE
ArrayList branchData = new ArrayList();
LinkedHashMap row = null;

row = new LinkedHashMap();
row.put("loan_number","123");	 //column 1
row.put("borrower_first_name", "Tim");//column 2
row.put("borrower_last_name", "Colson");//column 3
branchData.add(row); //add row to array list

row = new LinkedHashMap();
row.put("loan_number","456");	 //column 1
row.put("borrower_first_name", "Joe");//column 2
row.put("borrower_last_name", "Normal");//column 3
branchData.add(row); //add row to array list

row = new LinkedHashMap();
row.put("borrower_last_name", "Backward");//column 1
row.put("borrower_first_name", "Joe");//column 2
row.put("loan_number","789");	 //column 3
branchData.add(row); //add row to array list

request.setAttribute("branch_list", branchData);
// END TEST

--- template.vm

TESTING
<PRE>
#foreach ($rowhash in $branch_list)
 #foreach ($item in $rowhash)$item #end

#end
</PRE>
---- OUTPUT

TESTING 
 123 Tim Colson 
 456 Joe Normal 
 Backward Joe 789 

---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-user-help@jakarta.apache.org