Solved

Comparing 2 Lists Coldfusion

Posted on 2016-10-08
8
40 Views
Last Modified: 2016-10-09
I have 2 lists with the same numbered elements, just in the 2nd list one list element has moved positions. I need to know how to find the original position of the moved list element (from List1) and the position it moved to (in List2) using Coldfusion. Here is an example

<List1 = '1,2,3,4,5'>
<List2 = '2,3,1,4,5'>

I need to know that "1" in List1 moved to the 3rd position in List2. Couple things to know

1. Each list will have the exact same numbers in them (ie list elements - 1,2,3,4,5), only in a different order

2. Only one list element will move, ie 1 moved to the 3rd position, no other list elements would change.

3. A list element can move forward or backwards, so the "1" could move the the 3rd position or the "5" could have moved to the 2nd position.
0
Comment
Question by:seeraig
  • 4
  • 4
8 Comments
 
LVL 52

Accepted Solution

by:
_agx_ earned 500 total points
Comment Utility
Couple questions

2. Only one list element will move, ie 1 moved to the 3rd position, no other list elements would change.

In the example above, both "1" and "2" changed positions. Is that a typo?

3. A list element can move forward or backwards,

FWIW, you can't reliably determine an item was moved backward .. not from only the two lists anyway. The most you can do is determine that 2 or more elements have moved or swapped places.  For example:


Results:
struct
VALUE 	1                      <=== This is the value in the original or "FROM" position
FROM 	1                      <=== Original list position 1
TO 	        3                      <=== Moved to this list position 3

Open in new window


Code:

<cfset List1 = "1,2,3,4,5">
<cfset List2 = "2,3,1,4,5">

<cfset result = {}>
<cfset Array1 = listToArray(List1)>
<cfloop from="1" to="#arrayLen(Array1)#" index="oldPos">
      <!--- find this value in the other list --->
      <cfset newPos = listFindNoCase(list2, Array1[oldPos])>
      <!--- if it moved, store values and exit --->
      <cfif oldPos neq newPos>
            <cfset result = { from=oldPos, to=newPos, value=Array1[oldPos]} >
            <cfbreak>
      </cfif>
</cfloop>

<cfdump var="#result#">
0
 

Author Comment

by:seeraig
Comment Utility
thanks for your reply. yes i guess when i say only one element will move, that is not really true, the other elements are moving in relation to the one that actually moved. is there no way to know if an element moved backwards? for example

<cfset List1 = "1,2,3,4,5">
<cfset List2 = "5,1,2,3,4">

Here I would need to know that the 5 is the one that actually moved, the others are just moving in relation to the one that moved. but using your code it shows the "1" moved from the 1st position to the 2nd position

FROM       1
TO               2
VALUE       1
0
 
LVL 52

Expert Comment

by:_agx_
Comment Utility
Edit:

Unfortunately not. It's impossible to derive which element moved, and in which direction, if all you have is the 2 lists.  For example, if the new order were:

                    <List2 = '5,2,3,4,1'>

It could be that "1" was moved forward to the fifth position, or ... that "5" was moved backward to the first position.  However, unless you know the element that was moved, It's impossible to tell which.  If the lists were manipulated client side, like with drag and drop or something, you could capture the moved element before or during the move.  But without that piece of information, you can't really derive it after the fact. Not from just the two lists.
0
 

Author Comment

by:seeraig
Comment Utility
thanks again for your help on this. it's funny you mention drag and drop because that's what this is all about. So if you can just show me how to capture the moved element then I will be able to update things as I need to. I'm using this script below (the jquery version), what code do I need to capture the element that moved? The code automatically submits on drop event. The ajax goes to a coldfusion url that processes it, so I just need a way to capture the moved element into a coldfusion variable

https://davidwalsh.name/demo/drag-drop-sort-save-jquery.php
0
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 
LVL 52

Expert Comment

by:_agx_
Comment Utility
UPDATE:
it's funny you mention drag and drop because that's what this is all about.

Ok, but why do you need to know the direction items moved? If this is just straight db storage, the typical method is to either update everything OR delete/re-insert. Then order or direction changes aren't an issue.  Granted, updating only the records that moved can be slightly more efficient, in some cases, but it's also more complex and error prone.
My preference is the update all / delete/reinsert approach.

I'm using this script below (the jquery version)
   
If you still want to go the other direction, I'm not familiar with the plugin, but a quick search says you can hook into the drop event

     $( ".selector" ).droppable({
          drop: function( event, ui ) {}
     });

Then inside the function get the id of the moved element using:

         $(ui.draggable).attr("id")

With the id, you can grab the value and store it in a hidden field. Then use it identify the direction:
<cfset List1 = "1,2,3,4,5">
<cfset List2 = "5,2,3,4,1">
<cfset movedItem = "5">

<cfset oldPos = listFindNoCase(list1, movedItem)>
<cfset newPos = listFindNoCase(list2, movedItem)>
<cfset direction = (oldPos lt newPos ? "forward" : "backward")>
<cfoutput>
  #movedItem# moved #direction# from #oldPos# to #newPos#
</cfoutput>

Open in new window

0
 

Author Comment

by:seeraig
Comment Utility
omg you're right, i was making this way more complicated than I needed to. I just updated all elements based off of the new sort list and it works fine, no issues.
0
 

Author Closing Comment

by:seeraig
Comment Utility
fast to respond and very helpful in alternatives ways of doing it.
0
 
LVL 52

Expert Comment

by:_agx_
Comment Utility
Glad to help :)
0

Featured Post

What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

Join & Write a Comment

Hi, Even though I have created this Tutorial on My personal Blog, Some people might not able to find my website, So here i am posting it again Today, from the topic it is very clear that i will be showing you here the very basic usage of how we …
This is an updated version of a post made on my blog over 3 years ago. It is unfortunately, still very relevant as we continue to see both SQLi (SQL injection) and XSS (cross site scripting) attacks hitting some of the most recognizable website and …
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…
This video gives you a great overview about bandwidth monitoring with SNMP and WMI with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're looking for how to monitor bandwidth using netflow or packet s…

763 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

7 Experts available now in Live!

Get 1:1 Help Now