Randomly Sorting An Array In ColdFusion

Posted September 19, 2006 at 2:23 PM by Ben Nadel

Tags: ColdFusion

I touched upon this a bit when I was talking about randomly sorting a list in ColdFusion. Actually, one of the solutions to that problem was to create, as an interim object, a randomly sorted array. I figured as an example, I would just break it out here to see how it works.

To start with, as always, let's build an array:

  • <!--- Set the number of records. --->
  • <cfset intRecordCount = 4 />
  •  
  • <!--- Create an array. --->
  • <cfset arrGirls = ArrayNew( 1 ) />
  •  
  • <!--- Resize the array to be our test number. --->
  • <cfset ArrayResize( arrGirls, intRecordCount ) />
  •  
  • <!--- Now, we need to populate the array with data. --->
  • <cfloop index="intI" from="1" to="#intRecordCount#" step="1">
  •  
  • <!--- Create a struct for the girl data. --->
  • <cfset arrGirls[ intI ] = StructNew() />
  •  
  • <!--- Set the ID to be the index. --->
  • <cfset arrGirls[ intI ].ID = intI />
  •  
  • <!--- Now, randomly pick a girl to create. --->
  • <cfswitch expression="#RandRange( 1, 3 )#">
  • <cfcase value="1">
  •  
  • <cfset arrGirls[ intI ].Name = "Anna" />
  • <cfset arrGirls[ intI ].Hair = "Dirty Blonde" />
  •  
  • </cfcase>
  • <cfcase value="2">
  •  
  • <cfset arrGirls[ intI ].Name = "Alex" />
  • <cfset arrGirls[ intI ].Hair = "Blonde" />
  •  
  • </cfcase>
  • <cfcase value="3">
  •  
  • <cfset arrGirls[ intI ].Name = "Jo" />
  • <cfset arrGirls[ intI ].Hair = "Brunette" />
  •  
  • </cfcase>
  • </cfswitch>
  •  
  • </cfloop>

We should now have an array that is 4 items long:


 
 
 

 
CFDump 1 : Randomly Sorting An Array In ColdFusion  
 
 
 

I am keeping short for the demo. Now, we want to randomize the order of it. To do this, we are going to loop over the array N times and swap the item at the current index with the a random item in the array. I am not sure how *random* this is. I am sure that are mathematical proofs for determining how many times you should run across the array, but I am not gonna get into it. For now, this seems to work fine:

  • <!---
  • Loop over the array N times. In this case, I am
  • going to be looping twice.
  • --->
  • <cfloop index="intN" from="1" to="2" step="1">
  •  
  • <!--- Loop over the array. --->
  • <cfloop index="intI" from="1" to="#ArrayLen( arrGirls )#" step="1">
  •  
  • <!---
  • Swap the current item with a randomly chosen item.
  • We are getting the random index via RandRange().
  • --->
  • <cfset ArraySwap(
  • arrGirls,
  • intI,
  • RandRange( 1, ArrayLen( arrGirls ) )
  • ) />
  •  
  • </cfloop>
  •  
  • </cfloop>

Our array should now be randomly sorted:


 
 
 

 
CFDump 2 : Randomly Sorting An Array In ColdFusion  
 
 
 

I am not sure about speed testing because I don't really have anything to compare it to. The time it takes to process should increase linearly with the size of the array.




Reader Comments

Sep 19, 2006 at 10:02 PM // reply »
24 Comments

I think you'll hate me for this... but there is an easy java way to do this.

(this is off the top of my head, but it should work)

<cfscript>
Collections = createObject("java", "java.util.Collections");

Collections.shuffle(yourArray);
</cfscript>

There you go, the array is shuffled.

(I didn't test this btw, but I can't see why it wouldn't work)


Sep 20, 2006 at 7:41 AM // reply »
11,238 Comments

Mark,

Firstly, I am NEVER gonna hate learning how to do things an easier, simpler way.

Secondly, I am stuck without network access at the moment and can't test this stuff. But, from the documentation on collections, this seems totally valid. I am starting to like this Collections class.

I will test as soon as my boss gets here and give me back my network access :(


Jul 28, 2011 at 2:08 PM // reply »
369 Comments

and now we learn that Anna is actually a brunette, not a dirty blonde. :-P Haha, just kidding. Good work, Ben.


Post A Comment

Comment Etiquette: Please do not post spam. Please keep the comments on-topic. Please do not post unrelated questions or large chunks of code. And, above all, please be nice to each other - we're trying to have a good conversation here.

Please review the following issues:

Author Name:


Author Email:

Author Website:

Comment:

Supported HTML tags for formatting: <strong>bold</strong>   <em>italic</em>   <code>code</code>







  • Help Wanted - Find Your Next ColdFusion Job
Ben Nadel's Company - Epicenter Consulting Recent Blog Comments
May 17, 2013 at 7:42 PM
HashKeyCopier - An AngularJS Utility Class For Merging Cached And Live Data
Ben - thanks so much for posting these Angular articles and findings, they've been a huge help towards learning one of the more 'complex' JavaScript frameworks out there (IMO). I have been using Angu ... read »
May 16, 2013 at 5:01 PM
UPDATE: Parsing CSV Data Files In ColdFusion With csvToArray()
Your code was the closest thing I've found to obtaining some direction for converting ISO fields to values that CF can translate properly. Thank you for posting! ... read »
May 15, 2013 at 10:37 PM
Very Simple Pusher And ColdFusion Powered Chat
hi id making plz easy ... read »
May 15, 2013 at 6:07 PM
Making SOAP Web Service Requests With ColdFusion And CFHTTP
Ben, you once again saved my bacon at work. Thank you, thank you, thank you! ... read »
May 15, 2013 at 4:15 PM
What If All User Interface (UI) Data Came In Reports?
@Josh, Thanks! @Ben, I definitely recommend the David West book "Object Thinking" I've been quoting from. It goes deeply into the philosophy and history of OO programming. His breadth ... read »
May 15, 2013 at 11:36 AM
Ask Ben: Print Part Of A Web Page With jQuery
I found this helpfull when you need to keep (refresh) the original parent page after closing the iframe child print dialog (Hoping you're not using a form at this time so it won't submit again): On ... read »
May 14, 2013 at 7:13 PM
What If All User Interface (UI) Data Came In Reports?
@Jonah, If there's any books you'd recommend on the subject of domain modelling, I'd love to hear it. I just downloaded the free PDF of "Domain Driven Design Quickly". Figured I'd give it ... read »
May 14, 2013 at 6:57 PM
The UX Of Prototyping: Low-Fidelity Is The New High-Fidelity
@Phillip, I'm not sure I follow what you mean? Are you saying that you looked at the list of widgets provided by the jQuery UI and let that be your style guide? ... read »
InVision App - Prototyping Made Beautiful With Prototyping Tools