Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
Solved

# Comparing 2 Lists Coldfusion

Posted on 2016-10-08
Medium Priority
77 Views
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
Question by:seeraig
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 4
• 4

LVL 52

Accepted Solution

_agx_ earned 2000 total points
ID: 41835529
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
``````

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

ID: 41835558
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

ID: 41835568
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

ID: 41836039
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

LVL 52

Expert Comment

ID: 41836167
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>
``````
0

Author Comment

ID: 41836209
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

ID: 41836210
fast to respond and very helpful in alternatives ways of doing it.
0

LVL 52

Expert Comment

ID: 41836271
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article  is about submitting  form through  ColdFusion.Ajax.submitForm to the action page and send a response back in JSON format which later can be decoded using ColdFusion.JSON.decode. By this way you can avoid the usual page refresh for submâ€¦
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 â€¦
Have you created a query with information for a calendar? ... and then, abra-cadabra, the calendar is done?! I am going to show you how to make that happen. Visualize your data!  ... really see it To use the code to create a calendar from a qâ€¦
In this video, Percona Solution Engineer Dimitri Vanoverbeke discusses why you want to use at least three nodes in a database cluster. To discuss how Percona Consulting can help with your design and architecture needs for your database and infrasâ€¦
###### Suggested Courses
Course of the Month9 days, 14 hours left to enroll