开发者

How can I determine that one alphanumeric ID is greater than another in Ruby?

开发者 https://www.devze.com 2023-03-18 06:16 出处:网络
Right now I am working on a project that issues IDs consisting of both letters and numbers, for example 345A22. I need this progra开发者_如何学JAVAm to be able to tell that for example, 345B22 is grea

Right now I am working on a project that issues IDs consisting of both letters and numbers, for example 345A22. I need this progra开发者_如何学JAVAm to be able to tell that for example, 345B22 is greater than 345A22. I can't assume that the letters will be in the same position all the time (ie we do have some id's with 22335Q) but when I compare two numbers the letters will be in the same position.

How do I accomplish this in Ruby?


You can use the String#<=> method to compare strings. See documentation here.

>> "345B22" <=> "345A22"                                                
=> 1 

Where the 1 return value means that 345B22 is greater.


If a simple string comparison won't do the trick (e.g. different lengths, etc.), try converting the IDs (assuming they all match ^[0-9A-Z]*$) into integers by treating them as base36-encoded data.


In Ruby strings have the same comparison methods as numbers have.

2 > 1 #=> true
"2" > "1" #=> true
"B" > "A" #=> true


Not sure I understand your question, but I'm guessing that you mentally parse the ids into components (so 345B22 is 345, B, 22) and then are wishing for a numeric sort for things that are numbers (i.e., 12 > 2) and a string sort for things that are strings (AB < B).

If this is what you intend, something like the following would do the trick:

ids.sort_by do |id| 
  id.scan(/\d+|[a-zA-Z]+/).map {|c| c =~ /\d/ ? c.rjust(20) : c.ljust(20) }.join
end

What this does is extract out all consecutive numbers or letters and then justify them right or left based on their type, concatenates the result and then sorts based on this (expanded and canonicalized) id.

0

精彩评论

暂无评论...
验证码 换一张
取 消