things = "one thing, two things, three things, four things"
Учитывая эти данные, как разделить строку запятой, а затем обрезать пробел вокруг нее на месте? В результате:
things = ["one thing", "two things", "three things", "four things"]
В настоящее время у меня есть это:
things = things.to_s.tr("\n\t", "").strip.split(/,/)
Это делает большую часть того, что я хочу, за исключением удаления начального / конечного пробела, когда он разделяется на запятую , Какой лучший способ достичь этого? Я хотел бы сделать это как часть этого выражения, вместо того, чтобы присваивать вышеуказанный результат отдельному массиву и повторять его.
s = "one thing, two things, three things, four things"
s.split(",").map(&:strip)
# => ["one thing", "two things", "three things", "four things"]
В моей ОС Ubuntu 13.04 , используя Ruby 2.0.0p0
require 'benchmark'
s = "one thing, two things, three things, four things"
result = ""
Benchmark.bmbm do |b|
b.report("strip/split: ") { 1_000_000.times {result = s.split(",").map(&:strip)} }
b.report("regex: ") { 1_000_000.times {result = s.split(/\s*,\s*/)} }
end
Rehearsal -------------------------------------------------
strip/split: 6.260000 0.000000 6.260000 ( 6.276583)
regex: 7.310000 0.000000 7.310000 ( 7.320001)
--------------------------------------- total: 13.570000sec
user system total real
strip/split: 6.350000 0.000000 6.350000 ( 6.363127)
regex: 7.290000 0.000000 7.290000 ( 7.302163)
Не бить мертвую лошадь, но вы можете ускорить это, сделав два изменения, которые теперь стали для меня второй натурой. Первый - использовать map!
вместо map
, чтобы избежать создания копии разделенного массива, а второй - избегать использования символа для синтаксиса proc (например, &:split
, который добавляет дополнительную операцию, которую можно избежать с более подробным синтаксисом).
Ниже приведен контрольный показатель:
require 'benchmark'
s = "one thing, two things, three things, four things"
result = ""
Benchmark.bmbm do |b|
b.report("strip/split (map/to_proc): ") { 1_000_000.times { result = s.split(",").map(&:strip) } }
b.report("strip/split (map): ") { 1_000_000.times { result = s.split(",").map { |e| e.strip } } }
b.report("strip/split (map!/to_proc): ") { 1_000_000.times { result = s.split(",").map!(&:strip) } }
b.report("strip/split (map!): ") { 1_000_000.times { result = s.split(",").map! { |e| e.strip } } }
b.report("regex: ") { 1_000_000.times { result = s.split(/\s*,\s*/) } }
end
Результаты:
user system total real
strip/split (map/to_proc): 5.230000 0.010000 5.240000 ( 5.283079)
strip/split (map): 4.660000 0.010000 4.670000 ( 4.716920)
strip/split (map!/to_proc): 4.440000 0.020000 4.460000 ( 4.492943)
strip/split (map!): 4.320000 0.010000 4.330000 ( 4.365386)
regex: 7.190000 0.060000 7.250000 ( 7.322932)
Не забудьте прочитать числа относительно друг друга, а не относительно показателей, представленных в других ответах.
String[] array = {"John", "Mahta", "Sara"}
, и мы хотим этот вывод без скобки и запятых: John Mahta Sara
?
– Hengameh
18.10.2019, 16:48
Это не подразумевается как ответ на первоначальный вопрос, но я хотел поделиться кодом тестов, чтобы позволить людям самим проверить два предложенных решения:
require 'benchmark'
s = "one thing, two things, three things, four things"
result = ""
Benchmark.bmbm do |b|
b.report("strip/split: ") { 1_000_000.times {result = s.split(",").map(&:strip)} }
b.report("regex: ") { 1_000_000.times {result = s.split(/\s*,\s*/)} }
end
В моей системе (Ruby 2.0.0p247 на OS X 10.8), которая выдает следующий результат:
Rehearsal -------------------------------------------------
strip/split: 2.140000 0.000000 2.140000 ( 2.143905)
regex: 3.570000 0.010000 3.580000 ( 3.572911)
---------------------------------------- total: 5.720000sec
user system total real
strip/split: 2.150000 0.000000 2.150000 ( 2.146948)
regex: 3.580000 0.010000 3.590000 ( 3.590646)
Эти результаты, конечно, могут варьироваться в зависимости от версий ruby, аппаратного обеспечения и ОС.
String.join(",", anArray)
, таким образом, нет никакой потребности во внешних библиотеках.
– Pshemo
18.10.2019, 16:47
Используйте регулярное выражение для #split
:
"one thing, two things, three things, four things".split /\s*,\s*/
# => ["one thing", "two things", "three things", "four things"]
Как любитель скорости, я люблю тесты ... Но давайте посмотрим правде в глаза: если вы не выполняете эту операцию внутри миллиона циклов в вашем коде, различия в скорости, вероятно, не будут влиять на ваш код почти так же, как очевидные кодирующие конструкции.
По моему мнению, если производительность не имеет значения, у @arup есть лучшее, самое простое и ясное решение.