On 22/7/04 10:32 pm, "Matt Wells" <[EMAIL PROTECTED]> wrote: > My two lists: > > List1 = ["<text align="right">": 0, "<text align="left">": 10] > List2 = ["</text>": 10, </text>": 19] > > What I need is: > > List3 = ["<text align="right">": 0, "</text><text align="left">":10, > "</text>": 19]
Hi Matt, My solution is similar to Irv's. Differences are: + The structure of the input lists is the same as yours + You have the option of outputting with the same structure + </closing tag> items will always be placed first + Output will be ordered by item number, regardless of the order if items in the input - Irv's code is shorter. Cheers, James ---------------------------------------------------------------------------- on test list1 = [:] addProp(list1, "<text align=""E&"left""E&">", 10) addProp(list1, "<text align=""E&"right""E&">", 0) put combineLists(list1, ["</text>": 19, "</text>": 10]) end -- [0: "<text align="right">", 10: "</text><text align="left">", 19: "</text>"] on combineLists(aList1, aList2) tOutput = [:] -- will contain [<itemNumber>: </combined><tag>, ...] sort(tOutput) -- so that itemNumbers appear in ascending order aList1 = duplicate(aList1) aList2 = duplicate(aList2) tCount = count(aList1) -- assume list 1 is shorter tCount2 = count(aList2) if tCount > tCount2 then -- List 2 is in fact shorter. Swap lists so list 1 is shorter. tCount = tCount2 tTemp = aList2 aList2 = aList1 aList1 = tTemp end if -- aList1 is now the shorter list, and tCount is the number of items -- in it. repeat while tCount -- Copy the details of the last item in the list, then delete it tItemNumber = getAt(aList1, tCount) tTag = getPropAt(aList1, tCount) aList1.deleteAt(tCount) -- Check if aList2 contains an entry with the same item number tMatch = getPos(aList2, tItemNumber) if tMatch then -- Concatenate the items, ensuring that a </xxx> tag appears -- first. tTag2 = getPropAt(aList2, tMatch) if tTag2 starts "</" then tTag = tTag2&tTag else put tTag2 after tTag end if addProp(tOutput, tItemNumber, tTag) -- Delete the treated item from the longer list aList2.deleteAt(tMatch) else -- There is no match for the given item number addProp(tOutput, tItemNumber, tTag) end if tCount = tCount - 1 end repeat -- aList2 will now contain only unmatched items. Copy these to the -- output list. tCount = count(aList2) repeat while tCount tItemNumber = getAt(aList2, tCount) tTag = getPropAt(aList2, tCount) addProp(tOutput, tItemNumber, tTag) tCount = tCount - 1 end repeat -- -- Invert properties and values in tOutput, if required -- tTemp = tOutput -- tOutput = [:] -- tCount = count(tTemp) -- repeat with i = 1 to tCount -- tItemNumber = getAt(tTemp, i) -- tTag = getPropAt(tTemp, i) -- -- addProp(tOutput, tItemNumber, tTag) -- end repeat return tOutput end combineLists [To remove yourself from this list, or to change to digest mode, go to http://www.penworks.com/lingo-l.cgi To post messages to the list, email [EMAIL PROTECTED] (Problems, email [EMAIL PROTECTED]). Lingo-L is for learning and helping with programming Lingo. Thanks!]