Как я могу определить, что один буквенно-цифровой идентификатор больше, чем другой в Ruby? - PullRequest
1 голос
/ 09 июля 2011

Сейчас я работаю над проектом, который выпускает идентификаторы, состоящие из букв и цифр, например 345A22. Мне нужно, чтобы эта программа могла сказать, что, например, 345B22 больше, чем 345A22. Я не могу предположить, что буквы будут все время находиться в одной и той же позиции (то есть у нас есть некоторые идентификаторы с 22335Q), но когда я сравниваю два числа, буквы будут в одной и той же позиции.

Как мне это сделать в Ruby?

Ответы [ 4 ]

3 голосов
/ 09 июля 2011

Вы можете использовать метод String#<=> для сравнения строк. Смотри документацию здесь .

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

Где возвращаемое значение 1 означает, что 345B22 больше.

2 голосов
/ 09 июля 2011

В строках Ruby используются те же методы сравнения, что и у чисел.

2 > 1 #=> true
"2" > "1" #=> true
"B" > "A" #=> true
2 голосов
/ 09 июля 2011

Если простое сравнение строк не сработает (например, разная длина и т. Д.), Попробуйте преобразовать идентификаторы (при условии, что они все совпадают ^[0-9A-Z]*$) в целые числа, обрабатывая их как данные, закодированные в base36.

1 голос
/ 09 июля 2011

Не уверен, что понимаю ваш вопрос, но я предполагаю, что вы мысленно разбираете идентификаторы на компоненты (поэтому 345B22 - это 345, B, 22), а затем хотите числовую сортировку для вещей, которые являются числами (т.е. 12> 2) и сортировка строк для вещей, которые являются строками (AB Если это то, что вы намереваетесь, то что-то вроде следующего поможет:

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

Чтоон извлекает все последовательные числа или буквы, а затем выравнивает их вправо или влево в зависимости от их типа, объединяет результат и затем сортирует по этому (расширенному и канонизированному) идентификатору.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...