?
Solved

Comparing 2 Lists Coldfusion

Posted on 2016-10-08
8
Medium Priority
?
84 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 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

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
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

by:_agx_
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
How to Use the Help Bell

Need to boost the visibility of your question for solutions? Use the Experts Exchange Help Bell to confirm priority levels and contact subject-matter experts for question attention.  Check out this how-to article for more information.

 

Author Comment

by:seeraig
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

by:_agx_
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>

Open in new window

0
 

Author Comment

by:seeraig
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

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

Expert Comment

by:_agx_
ID: 41836271
Glad to help :)
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Hi, I will be creating today a basic tutorial on how we can create a Mail Custom Function and use it where ever we want. The main advantage about creating a custom function is that we can accommodate a range of arguments to pass to the Function and …
Recently while working on a project I got a very annoying cfdocument has no body error message. I had never seen this error before. So I checked the code. The code was pretty simple; it was Just showing me the cfdocumnt tag and inside that tag a …
We’ve all felt that sense of false security before—locking down external access to a database or component and feeling like we’ve done all we need to do to secure company data. But that feeling is fleeting. Attacks these days can happen in many w…
When cloud platforms entered the scene, users and companies jumped on board to take advantage of the many benefits, like the ability to work and connect with company information from various locations. What many didn't foresee was the increased risk…
Suggested Courses

830 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