View Single Post
  #2  
Unread 10-14-2020, 10:20 PM
Garan's Avatar
Garan Garan is offline
The Undying
Interface Author - Click to view interfaces
 
Join Date: Oct 2010
Posts: 341
Try
Code:

_cmds = {
{ chance = 50, priority = 1 },
{ chance = 100, priority = 10 },
{ chance = 100, priority = 7 },
{ chance = 75, priority = 5 },
}

table.sort(_cmds, function(a,b)
	if a.chance == 100 and b.chance == 100 then
		if a.priority < b.priority then
			return true
		else
			return false
		end
	else
		if a.chance==100 and b.chance~=100 then
			return true
		else
			if a.chance~=100 and b.chance==100 then
				return false
			else
				if a.priority < b.priority then
					return true
				else
					return false
				end
			end
		end
	end
end)
Hint, when comparing any two rows, there are four possible conditions for the chance: both equal 100, first equal 100 and second not equal 100, first not equal to 100 and second equal 100 and finally the default of neither equal 100 (you only care about priority in the first and last cases). Note, this could be simplified slightly, but by laying it out this way it is easy to see how the conditionals work out. For instance, the following code has the same result:
Code:
_cmds = {
{ chance = 50, priority = 1 },
{ chance = 100, priority = 10 },
{ chance = 100, priority = 7 },
{ chance = 75, priority = 5 },
}

table.sort(_cmds, function(a,b)
	if a.chance == 100 then
		if b.chance==100 then
			if a.priority < b.priority then
				return true
			else
				return false
			end
		else
			return true
		end
	else
		if b.chance==100 then
			return false
		else
			if a.priority < b.priority then
				return true
			else
				return false
			end
		end
	end
end)
A slightly more elegant solution returns the result of the priority comparison without an explicit if-then clause:
Code:
_cmds = {
{ chance = 50, priority = 1 },
{ chance = 100, priority = 10 },
{ chance = 100, priority = 7 },
{ chance = 75, priority = 5 },
}

table.sort(_cmds, function(a,b)
	if a.chance == 100 then
		if b.chance==100 then
			return (a.priority < b.priority)
		else
			return true
		end
	else
		if b.chance==100 then
			return false
		else
			return (a.priority < b.priority)
		end
	end
end)
There are even more elegant but less easily understood versions but you get the idea...

Last edited by Garan : 10-14-2020 at 10:57 PM. Reason: clarity
Reply With Quote