Saya mengedit jawaban saya, jadi mungkin saja mengubah jawaban yang Anda pilih. Lihat apakah Anda dapat menghadiahkannya pada jawaban Jason Stirk karena jawabannya adalah yang tercepat, dan sangat mudah dibaca.
the Tin Man
3
Gunakan str [1 ..- 1], yang tercepat menurut jawaban di bawah ini.
Achyut Rastogi
1
Pada Ruby 2.5 Anda dapat menggunakan delete_prefixdan delete_prefix!- detail lebih lanjut di bawah ini . Saya tidak punya waktu untuk melakukan benchmark, tetapi akan segera melakukannya!
SRack
Pembaruan: Saya telah membuat tolok ukur metode baru ( delete_prefix\ delete_prefix!) dan cukup cepat. Tidak cukup mem-favorit kecepatan sebelumnya, tetapi keterbacaan berarti mereka adalah opsi baru yang hebat untuk dimiliki!
1.9.3
user system total real
[0]0.8400000.0000000.840000(0.847496)
sub 1.9600000.0100001.970000(1.962767)
gsub 4.3500000.0200004.370000(4.372801)[1..-1]0.7100000.0000000.710000(0.713366)
slice 1.0200000.0000001.020000(1.020336)
length 1.1600000.0000001.160000(1.157882)
Memperbarui untuk memasukkan satu lagi jawaban yang disarankan:
2.1.2
user system total real
[0]0.3000000.0000000.300000(0.295054)
sub 0.6300000.0000000.630000(0.631870)
gsub 2.0900000.0000002.090000(2.094368)[1..-1]0.2300000.0100000.240000(0.232846)
slice 0.3200000.0000000.320000(0.320714)
length 0.3400000.0000000.340000(0.341918)
eat!0.4600000.0000000.460000(0.452724)
reverse 0.4000000.0000000.400000(0.399465)
Dan yang lain menggunakan /^./untuk menemukan karakter pertama:
Berikut ini pembaruan lain pada perangkat keras yang lebih cepat dan versi Ruby yang lebih baru:
2.3.1
user system total real
[0]0.2000000.0000000.200000(0.204307)[/^./]0.3900000.0000000.390000(0.387527)[/^\[/]0.3600000.0000000.360000(0.360400)
sub+0.4900000.0000000.490000(0.492083)
sub 0.4800000.0000000.480000(0.487862)
gsub 1.9900000.0000001.990000(1.988716)[1..-1]0.1800000.0000000.180000(0.181673)
slice 0.2600000.0000000.260000(0.266371)
length 0.2700000.0000000.270000(0.267651)
eat!0.4000000.0100000.410000(0.398093)
reverse 0.3400000.0000000.340000(0.344077)
Mengapa gsub sangat lambat?
Setelah melakukan pencarian / ganti, gsubharus memeriksa kemungkinan kecocokan tambahan sebelum dapat mengetahui apakah sudah selesai. subhanya melakukan satu dan selesai. Anggaplah gsubitu minimal dua subpanggilan.
Juga, penting untuk diingat itu gsub, dan subjuga bisa cacat oleh regex yang ditulis dengan buruk yang cocok jauh lebih lambat daripada pencarian sub-string. Jika mungkin jangkar regex untuk mendapatkan kecepatan maksimal darinya. Ada jawaban di sini di Stack Overflow yang menunjukkan hal itu jadi cari di sekitar jika Anda ingin informasi lebih lanjut.
Penting untuk dicatat bahwa ini hanya akan berfungsi di Ruby 1.9. Di Ruby 1.8, ini akan menghapus byte pertama dari string, bukan karakter pertama, yang bukan yang diinginkan OP.
Jörg W Mittag
+1: Saya selalu lupa bahwa untuk posisi string Anda tidak hanya dapat menetapkan satu karakter, tetapi juga Anda dapat memasukkan substring. Terima kasih!
quetzalcoatl
"[12,23,987,43".delete "["
rupweb
4
Itu menghapusnya dari semua posisi, yang bukan yang diinginkan OP: "... untuk karakter pertama?".
the Tin Man
2
" what about "[12,23,987,43".shift ?"? Bagaimana dengan "[12,23,987,43".shift NoMethodError: undefined method shift 'for "[12,23,987,43": String`?
the Tin Man
293
Mirip dengan jawaban Pablo di atas, tetapi pembersih warna:
str[1..-1]
Akan mengembalikan array dari 1 ke karakter terakhir.
+1 Lihatlah hasil tolok ukur yang saya tambahkan ke jawaban saya. Anda mendapatkan waktu tercepat, ditambah lagi saya pikir ini sangat bersih.
the Tin Man
Bagaimana dengan kinerja str[1,]dibandingkan dengan di atas?
Bohr
1
@ Bob: str[1,]mengembalikan karakter ke-2 karena rentangnya 1:nil. Anda harus memberikan panjang yang dihitung sebenarnya, atau sesuatu yang dijamin lebih tinggi dari panjang, seperti, str[1,999999](gunakan int_max tentu saja) untuk mendapatkan seluruh ekor. [1..-1]lebih bersih dan mungkin lebih cepat, karena Anda tidak perlu beroperasi dengan panjang secara manual (lihat [1..length] dalam tolok ukur)
quetzalcoatl
4
Solusi yang sangat bagus Omong-omong jika seseorang ingin menghapus karakter pertama dan terakhir:str[1..-2]
pisaruk
50
Kita dapat menggunakan slice untuk melakukan ini:
val ="abc"=>"abc"
val.slice!(0)=>"a"
val
=>"bc"
Menggunakan slice!kami dapat menghapus karakter apa pun dengan menentukan indeksnya.
slice!(0)Jawaban elegan ini benar-benar harus dipilih, karena menggunakan asdf[0] = '' untuk menghapus karakter pertama adalah konyol (seperti menggunakan gsub dengan regex dan menembak lalat dengan howitzer).
f055
1
Meskipun mungkin tampak tidak intuitif di permukaan, []=tidak memerlukan banyak kode C yang mendasarinya, di mana slice!membutuhkan kerja tambahan. Itu bertambah. Argumennya mungkin "Mana yang lebih mudah dibaca?" Saya menemukan menggunakan []=dibaca, tapi saya berasal dari latar belakang C -> Perl yang mungkin mewarnai pemikiran saya. Pengembang Java mungkin akan berpikir itu kurang mudah dibaca. Entah merupakan cara yang dapat diterima untuk menyelesaikan tugas selama itu mudah dipahami dan dipelihara dan tidak memuat CPU secara berlebihan.
the Tin Man
Baik. Apakah Anda tahu bagaimana kami dapat mengukur jika suatu fungsi mengambil banyak beban CPU dalam ROR? atau haruskah kita menggunakan perbedaan waktu eksekusi dalam mili atau nanodetik?
balanv
18
Ruby 2.5+
Pada Ruby 2.5 Anda dapat menggunakan delete_prefixatau delete_prefix!untuk mencapai ini dengan cara yang dapat dibaca.
Menggunakan pengaturan tolok ukur Tin Man, tampilannya juga cukup cepat (di bawah dua entri terakhir delete_pdan delete_p!). Tidak cukup mengunggah fave sebelumnya untuk kecepatan, meskipun sangat mudah dibaca.
2.5.0
user system total real
[0]0.1747660.0004890.175255(0.180207)[/^./]0.3180380.0005100.318548(0.323679)[/^\[/]0.3726450.0011340.373779(0.379029)
sub+0.4602950.0015100.461805(0.467279)
sub 0.4983510.0015340.499885(0.505729)
gsub 1.6698370.0051411.674978(1.682853)[1..-1]0.1998400.0009760.200816(0.205889)
slice 0.2796610.0008590.280520(0.285661)
length 0.2683620.0003100.268672(0.273829)
eat!0.3417150.0005240.342239(0.347097)
reverse 0.3353010.0005880.335889(0.340965)
delete_p 0.2222970.0008320.223129(0.228455)
delete_p!0.2257980.0007470.226545(0.231745)
Saya akan menggunakan "[12,23,987,43".sub(/^\[+/, "")sebagai gantinya gsub(/^\[/, ""). Yang pertama memungkinkan mesin regex menemukan semua kecocokan kemudian diganti dalam satu aksi dan menghasilkan peningkatan kecepatan 2x dengan Ruby 1.9.3.
the Tin Man
1
Karena kita berhadapan dengan string, haruskah ini gsub(/\A\[/, "") ?
1.9.2-p290 > a ="One Two Three"=>"One Two Three"1.9.2-p290 > a = a[1..-1]=>"ne Two Three"1.9.2-p290 > a = a[1..-1]=>"e Two Three"1.9.2-p290 > a = a[1..-1]=>" Two Three"1.9.2-p290 > a = a[1..-1]=>"Two Three"1.9.2-p290 > a = a[1..-1]=>"wo Three"
Dengan cara ini Anda dapat menghapus satu per satu karakter pertama dari string.
Jika Anda ingin melestarikan semantik "chop" yang Anda bisa"[12,23,987,43".reverse.chop.reverse
Chris Heald
itu adalah overhead kinerja yang cukup besar hanya untuk melepaskan satu arang
Pablo Fernandez
7
mengapa tidak menggunakan [1 ..- 1] daripada [1..self.length]?
horseyguy
Contoh Monkey patching cukup bagus untuk pertanyaan ini, itu hanya IMO yang tidak relevan dan jelek.
dredozubov
3
Terima kasih kepada @ the-tin-man karena telah menyusun tolok ukur!
Sayangnya, saya tidak terlalu suka solusi itu. Entah mereka memerlukan langkah ekstra untuk mendapatkan hasil ( [0] = '', .strip!) atau mereka tidak terlalu semantik / jelas tentang apa yang terjadi ( [1..-1]: "Um, rentang dari 1 hingga negatif 1? Yearg?"), Atau mereka lambat atau panjang untuk tulis ( .gsub, .length).
Apa yang kami coba adalah 'shift' (dalam bahasa Array), tetapi mengembalikan karakter yang tersisa, alih-alih apa yang dialihkan. Mari gunakan Ruby kami untuk memungkinkan ini dengan string! Kita dapat menggunakan operasi braket cepat, tetapi berikan nama yang bagus, dan ambil argumen untuk menentukan seberapa banyak kita ingin mengompromikan bagian depan:
Tetapi ada lebih banyak yang bisa kita lakukan dengan operasi braket yang cepat tapi tidak berat. Sementara kita berada di dalamnya, untuk kelengkapan, mari kita menulis a #shiftdan #firstuntuk String (mengapa Array harus bersenang-senang‽‽), mengambil argumen untuk menentukan berapa banyak karakter yang ingin kita hapus dari awal:
classStringdef first(how_many =1)self[0...how_many]enddef shift(how_many =1)
shifted = first(how_many)self.replace self[how_many..-1]
shifted
end
alias_method :shift!,:shift
end
Ok, sekarang kita memiliki cara yang jelas untuk menarik karakter dari bagian depan string, dengan metode yang konsisten dengan Array#firstdan Array#shift(yang benar-benar harus menjadi metode bang ??). Dan kita juga dapat dengan mudah mendapatkan string yang dimodifikasi #eat!. Hm, haruskah kita berbagi eat!kekuatan baru kita dengan Array? Kenapa tidak!
Penting untuk dicatat bahwa ini hanya akan berfungsi di Ruby 1.9. Di Ruby 1.8, ini akan menghapus byte pertama dari string, bukan karakter pertama, yang bukan yang diinginkan OP.
Jörg W Mittag
0
classStringdef bye_felicia()
felicia =self.strip[0]#first char, not first space.self.sub(felicia,'')endend
delete_prefix
dandelete_prefix!
- detail lebih lanjut di bawah ini . Saya tidak punya waktu untuk melakukan benchmark, tetapi akan segera melakukannya!delete_prefix
\delete_prefix!
) dan cukup cepat. Tidak cukup mem-favorit kecepatan sebelumnya, tetapi keterbacaan berarti mereka adalah opsi baru yang hebat untuk dimiliki!Jawaban:
Saya agak suka menggunakan sesuatu seperti:
Saya selalu mencari cara tercepat dan paling mudah dibaca dalam melakukan sesuatu:
Berjalan di Mac Pro saya:
Memperbarui untuk memasukkan satu lagi jawaban yang disarankan:
Yang mengakibatkan:
Dan yang lain menggunakan
/^./
untuk menemukan karakter pertama:Yang mengakibatkan:
Berikut ini pembaruan lain pada perangkat keras yang lebih cepat dan versi Ruby yang lebih baru:
Setelah melakukan pencarian / ganti,
gsub
harus memeriksa kemungkinan kecocokan tambahan sebelum dapat mengetahui apakah sudah selesai.sub
hanya melakukan satu dan selesai. Anggaplahgsub
itu minimal duasub
panggilan.Juga, penting untuk diingat itu
gsub
, dansub
juga bisa cacat oleh regex yang ditulis dengan buruk yang cocok jauh lebih lambat daripada pencarian sub-string. Jika mungkin jangkar regex untuk mendapatkan kecepatan maksimal darinya. Ada jawaban di sini di Stack Overflow yang menunjukkan hal itu jadi cari di sekitar jika Anda ingin informasi lebih lanjut.sumber
"[12,23,987,43".delete "["
what about "[12,23,987,43".shift ?
"? Bagaimana dengan"[12,23,987,43".shift NoMethodError: undefined method
shift 'for "[12,23,987,43": String`?Mirip dengan jawaban Pablo di atas, tetapi pembersih warna:
Akan mengembalikan array dari 1 ke karakter terakhir.
sumber
str[1,]
dibandingkan dengan di atas?str[1,]
mengembalikan karakter ke-2 karena rentangnya1:nil
. Anda harus memberikan panjang yang dihitung sebenarnya, atau sesuatu yang dijamin lebih tinggi dari panjang, seperti,str[1,999999]
(gunakan int_max tentu saja) untuk mendapatkan seluruh ekor.[1..-1]
lebih bersih dan mungkin lebih cepat, karena Anda tidak perlu beroperasi dengan panjang secara manual (lihat [1..length] dalam tolok ukur)str[1..-2]
Kita dapat menggunakan slice untuk melakukan ini:
Menggunakan
slice!
kami dapat menghapus karakter apa pun dengan menentukan indeksnya.sumber
slice!(0)
Jawaban elegan ini benar-benar harus dipilih, karena menggunakanasdf[0] = ''
untuk menghapus karakter pertama adalah konyol (seperti menggunakan gsub dengan regex dan menembak lalat dengan howitzer).[]=
tidak memerlukan banyak kode C yang mendasarinya, di manaslice!
membutuhkan kerja tambahan. Itu bertambah. Argumennya mungkin "Mana yang lebih mudah dibaca?" Saya menemukan menggunakan[]=
dibaca, tapi saya berasal dari latar belakang C -> Perl yang mungkin mewarnai pemikiran saya. Pengembang Java mungkin akan berpikir itu kurang mudah dibaca. Entah merupakan cara yang dapat diterima untuk menyelesaikan tugas selama itu mudah dipahami dan dipelihara dan tidak memuat CPU secara berlebihan.Ruby 2.5+
Pada Ruby 2.5 Anda dapat menggunakan
delete_prefix
ataudelete_prefix!
untuk mencapai ini dengan cara yang dapat dibaca.Dalam hal ini
"[12,23,987,43".delete_prefix("[")
.Info lebih lanjut di sini:
Dokumen resmi
https://blog.jetbrains.com/ruby/2017/10/10-new-features-in-ruby-2-5/
https://bugs.ruby-lang.org/issues/12694
NB Anda juga dapat menggunakan ini untuk menghapus item dari ujung string dengan
delete_suffix
dandelete_suffix!
Edit:
Menggunakan pengaturan tolok ukur Tin Man, tampilannya juga cukup cepat (di bawah dua entri terakhir
delete_p
dandelete_p!
). Tidak cukup mengunggah fave sebelumnya untuk kecepatan, meskipun sangat mudah dibaca.sumber
Saya lebih memilih ini:
sumber
Jika Anda selalu ingin menghapus tanda kurung terkemuka:
Jika Anda hanya ingin menghapus karakter pertama, dan Anda tahu itu tidak akan berada dalam set karakter multibyte:
atau
sumber
"[12,23,987,43".sub(/^\[+/, "")
sebagai gantinyagsub(/^\[/, "")
. Yang pertama memungkinkan mesin regex menemukan semua kecocokan kemudian diganti dalam satu aksi dan menghasilkan peningkatan kecepatan 2x dengan Ruby 1.9.3.gsub(/\A\[/, "")
?Alternatif tidak efisien:
sumber
Misalnya: a = "Satu Dua Tiga"
Dengan cara ini Anda dapat menghapus satu per satu karakter pertama dari string.
sumber
Jalan mudah:
Cara yang mengagumkan:
(Catatan: lebih suka cara mudah :))
sumber
"[12,23,987,43".reverse.chop.reverse
Terima kasih kepada @ the-tin-man karena telah menyusun tolok ukur!
Sayangnya, saya tidak terlalu suka solusi itu. Entah mereka memerlukan langkah ekstra untuk mendapatkan hasil (
[0] = ''
,.strip!
) atau mereka tidak terlalu semantik / jelas tentang apa yang terjadi ([1..-1]
: "Um, rentang dari 1 hingga negatif 1? Yearg?"), Atau mereka lambat atau panjang untuk tulis (.gsub
,.length
).Apa yang kami coba adalah 'shift' (dalam bahasa Array), tetapi mengembalikan karakter yang tersisa, alih-alih apa yang dialihkan. Mari gunakan Ruby kami untuk memungkinkan ini dengan string! Kita dapat menggunakan operasi braket cepat, tetapi berikan nama yang bagus, dan ambil argumen untuk menentukan seberapa banyak kita ingin mengompromikan bagian depan:
Tetapi ada lebih banyak yang bisa kita lakukan dengan operasi braket yang cepat tapi tidak berat. Sementara kita berada di dalamnya, untuk kelengkapan, mari kita menulis a
#shift
dan#first
untuk String (mengapa Array harus bersenang-senang‽‽), mengambil argumen untuk menentukan berapa banyak karakter yang ingin kita hapus dari awal:Ok, sekarang kita memiliki cara yang jelas untuk menarik karakter dari bagian depan string, dengan metode yang konsisten dengan
Array#first
danArray#shift
(yang benar-benar harus menjadi metode bang ??). Dan kita juga dapat dengan mudah mendapatkan string yang dimodifikasi#eat!
. Hm, haruskah kita berbagieat!
kekuatan baru kita dengan Array? Kenapa tidak!Sekarang kita bisa:
Itu lebih baik!
sumber
chip()
bukanchop()
(danchimp()
sebagai analogchomp()
).sumber
sumber
Menggunakan regex:
sumber
Saya menemukan solusi yang bagus
str.delete(str[0])
untuk keterbacaannya, meskipun saya tidak bisa membuktikan kinerjanya.sumber
Daftar menjatuhkan satu atau lebih elemen dari awal array, tidak bermutasi array, dan mengembalikan array itu sendiri, bukan elemen yang dijatuhkan.
sumber