2014-11-05 4 views
-4

Как бы вы сортировать список в Python и массив в Ruby, как:Как отсортировать массив числовых строк и строк слов

["car", "z", "9", "bus", "3"] 

иметь этот массив в ответ:

["bus", "car", "3", "z", "9"] 

Я я начал строить его в Ruby, потому что я знаю это лучше. Я попробовал .sort без параметров. Затем я начал писать сортировку вставки, надеясь, что перестрою ее в свой заказ и напишу этот метод.

def sort 
@array.each do |value| 
    index = @array.index(value) 
    i = index - 1 
    while i >= 0 
    if value < @array[i] 
     @array[i + 1] = @array[i] 
     @array[i] = value 
    elsif (value =~ /\d/) == 0 
     # I wanted to do something here, whenever it stops at number to word comparison but didn't come up with anything workable 
    else 
     break 
    end 
    end 
end 

конец

Все, что я могу получить это [ "3", "9", "автобус", "автомобиль", "г"] Но это код вызов, который я должен заполнить и цель состоит в том, чтобы отсортировать массив строк в алфавитном и цифровом порядке, сохраняя индексы числовых строк, как в исходном массиве, просто помещая их в порядке возрастания. Я думал создать 2 хэша для чисел с и слова, имеющие свои ключи как индексы в исходном массиве, и отсортировать только значения, а затем ввести их в правильном порядке в новом массиве, но не смог написать код для него и все еще не уверен, что это будет лучшая идея.

+5

Во-первых, выберите один язык. Во-вторых, объясните, почему вы думаете, что должен быть выход. В-третьих, покажите, что вы пробовали до сих пор, и опишите, что именно проблема с ним. – jonrsharpe

+5

И, прежде всего, объясните, почему вы думаете, что '' 3 "' следует сортировать перед '" z "', но '' 9 "' приходит после. Я не вижу здесь никакой логической прогрессии. –

+0

Извините за плохой старт, для меня было раннее утро. Просто отредактировал его. –

ответ

-1

Вам нужно найти драгоценный камень (или написать что-нибудь самостоятельно), который может превращать числа в их форму слова.

Как, например:

https://github.com/radar/humanize

Остальное должно быть очевидно.

+0

Ну, будет немного смешать его. 293 - двести девяти трех, это [«два», «сто», «ninty», «three»]. Sort == ["сто", "ninty", "three", "two"] И это не результат мне нужен. –

0

Так вот, как я решил. Спасибо Марку Томасу за подсказку с разделами и вставками. Просьба прокомментировать ваши мысли и предложения об эффективности и ясности кода.

def sort 
    # storing indicies of number strings to map them back later 
    num_indicies = @array.map {|i| @array.index(i) if (i =~ /\d/) == 0}.compact 
    # if there are no numbers 
    if num_indicies.empty? 
    @array.sort! 
    #if there are only numbers 
    elsif num_indicies.length == @array.length 
    @array = @array.map {|n| n.to_i}.sort 
    else 
    # separating numbers and words for proper sort 
    separation = @array.partition {|c| (c =~ /\d/) == 0} 
    # sorting first array. Converting to integer in order to sort numbers bigger than 10 
    separation[0] = separation[0].map {|n| n.to_i}.sort 
    # sorting array of words and letters 
    separation[1].sort! 
    # inserting numbers in their original spots 
    index = 0 
    separation[0].each do |num| 
     #inserting sorted integers inside of array of sorted strings, simultaniously converting them into strings 
     @array = separation[1].insert(num_indicies[index], num.to_s) 
     # switching index for another iteration 
     index += 1 
    end 
    end 
end 
Смежные вопросы