2

私は配列を持ってい[1, 2, "3", "4", "1a", "abc", "a"]ます

  • 純粋な整数 ( 1, 2),
  • 文字列形式の整数 ( "1", "2"),
  • 文字列 ( "a""b")、および
  • 混合文字列番号 ( "1a", "2s")。

これから、整数 (フォーマットされた文字列を含む) 12"3"、のみを取得する必要があり"4"ます。

最初に試したのはto_i

arr = [1, 2, "3", "4", "1a", "abc", "a"]
arr.map {|x| x.to_i}
# => [1, 2, 3, 4, 1, 0, 0]

しかし、これは私が期待していない に変換"1a"されます。1

それから私は試しましたInteger(item)

arr.map {|x| Integer(x) }  # and it turned out to be
# => ArgumentError: invalid value for Integer(): "1a"

今、私はここで直接変換オプションを使い果たしました. 最後に、値to_iとを変換するこの方法を行うことにしましたto_s"1" == "1".to_i.to_s整数もそうですが、そうでは"1a" == "1a".to_i.to_sありません。"a" == "a".to_i.to_s

arr  = arr.map do |x|
  if (x == x.to_i.to_s)
    x.to_i
  else
    x
  end
end

ids, names= arr.partition { |item| item.kind_of? Fixnum }

これで、整数と文字列の配列を取得できました。これを行う簡単な方法はありますか?

4

7 に答える 7

7

@maerics が提供するものと同様のソリューションですが、少しスリムです。

arr.map {|x| Integer(x) rescue nil }.compact
于 2011-04-24T11:08:29.500 に答える
3
class Array
  def to_i
    self.map {|x| begin; Integer(x); rescue; nil; end}.compact
  end
end

arr = [1, 2, "3", "4", "1a", "abc", "a"]
arr.to_i # => [1, 2, 3, 4]
于 2011-04-24T08:26:42.097 に答える
2

このようなもの:

a = [1,2,"3","4","1a","abc","a"]



irb(main):005:0> a.find_all { |e| e.to_s =~ /^\d+$/ }.map(&:to_i)
=> [1, 2, 3, 4]
于 2011-04-24T08:31:20.897 に答える
2

ねえ、私のルビーを目覚めさせてくれてありがとう。これが私のこの問題への取り組みです:

arr=[1,2,"3","4","1a","abc","a"]
arr.map {|i| i.to_s}.select {|s| s =~ /^[0-9]+$/}.map {|i| i.to_i}
//=> [1, 2, 3, 4]
于 2011-04-24T08:31:47.973 に答える
1

これはどう?

[1,2,"3","4","1a","abc","a"].select{|x| x.to_i.to_s == x.to_s}
# => [1, 2, "3", "4"]
于 2011-04-24T16:56:51.903 に答える
1

これまでの回答のほとんどで、「3」と「4」の値が実際の整数に変更されていることに気付きました。

>> array=[1, 2, "3", "4", "1a", "abc", "a", "a13344a" , 10001, 3321]
=> [1, 2, "3", "4", "1a", "abc", "a", "a13344a", 10001, 3321]
>> array.reject{|x| x.to_s[/[^0-9]/] }
=> [1, 2, "3", "4", 10001, 3321]

@OP、私は自分のソリューションを徹底的にテストしていませんが、これまでのところうまくいくようです(もちろん、提供されたサンプルに従って行われます)ので、自分で徹底的にテストしてください。

于 2011-04-24T12:17:44.617 に答える
0

かなりシンプルに見える

arr.select{ |b| b.to_s =~ /\d+$/ }
# or
arr.select{ |b| b.to_s[/\d+$/] }
#=> [1, 2, "3", "4"]
于 2011-04-24T17:31:28.197 に答える