2016-07-20 12 views
-2

Ich habe ein ArrayRuby: Welche Methode wird für Array von Hashes verwendet, um eine Zeichenfolge mit allen Hashwerten zu erhalten?

[{name: "vivek"},{name:"ramesh"},{name: "suresh"},{name:"ganesh"}] 

Ich möchte ein Verfahren zu schaffen, die Ausgabe als

"vivek,ramesh,suresh and ganesh". 

zurück, wenn es nur zwei Hashes sind wie

[{name: "vivek"},{name: "ramesh"}] 

Ausgang

sollte
"vivek and ramesh" 

, wenn die Namen sind mehr als 5 Ausgabe sollte „vivek, Ramesh, Suresh, nilash, ganesh etc ..“ sein

arr=[{name: 'vivek'},{name: 'Ganesh'},{name: 'Suresh'},{name: 'Ramesh'},{name: 'Bavesh'}]#,{name: 'Mukesh'}] 
a = arr.size 

case a 

when 1 
    puts arr[0][:name] 


when 2 
    puts arr[0][:name]+" and "+arr[1][:name] 



when 3..5 
    ar = [] 
    i=0 
    while i<arr.size-2 
    ar << arr[i] 
    i += 1 
    end 

ar.each{|hash| printf "#{hash[:name]}"+","} 

printf "#{arr[-2][:name]} and #{arr[-1][:name]}." 

puts "" 


when 6..100 
    ar = [] 
    i=0 
    while i<4 
    ar << arr[i] 
    i += 1 
    end 

ar.each{|hash| printf "#{hash[:name]}"+","} 

printf "#{arr[4][:name]} etc..." 

puts "" 

else 
    puts "Error" 
end 

ich habe wie this..but ich weiß, sollte es einen besseren Weg, dies zu tun mit geeigneten Methoden können .. jemand helfen

Antwort

3

Ich würde so etwas tun:

def names_to_sentence(array) 
    names = array.map { |hash| hash[:name] } 

    case names.length 
    when (0..1) 
    names.first.to_s 
    when (2..5) 
    "#{names[0...-1].join(', ')} and #{names[-1]}" 
    else 
    "#{names[0..4].join(', ')} etc" 
    end 
end 

names_to_sentence([{name: "vivek"},{name:"ramesh"},{name: "suresh"},{name:"nilash"},{name:"ganesh"},{name: "foobar"}]) 
#=> "vivek, ramesh, suresh, nilash, ganesh etc" 
names_to_sentence([{name: "vivek"},{name:"ramesh"},{name: "suresh"},{name:"ganesh"}]) 
#=> "vivek, ramesh, suresh and ganesh" 
names_to_sentence([{name: "vivek"},{name: "ramesh"}]) 
#=> "vivek and ramesh" 
names_to_sentence([{name: "vivek"}])  
#=> "vivek" 
names_to_sentence([])  
#=> "" 
0

Arbeiten für 0, 1, 2 und 2 + Namen:

arr = [{name: "vivek"},{name:"ramesh"},{name: "suresh"},{name:"ganesh"}] 
names = arr.map { |h| h[:name] } 
str = [names.length>1 ? names[0..-2].join(", ") : nil, 
     names[-1]].compact.join(" and ") 

sah die „mehr als 5“ Fall zu spät - als Übung, um sich nach links. :)

+0

str = [names.length> 1? Namen [0..5] .join (","): nil] .join << "etc .." ??? – Vivek

0
λ = ->(input) do 
    output = input.flat_map(&:values) 
    if output.size > 5 
    output.take(5).join(', ') << ' etc.' 
    else 
    [output.pop, output.join(', ')].reverse.join(' and ') 
    end 
end 

λ.([{name: "vivek"},{name:"ramesh"},{name: "suresh"},{name:"ganesh"}]) 
#⇒ "vivek, ramesh, suresh and ganesh" 

λ.([{name: "vivek"},{name:"ramesh"}]) 
#⇒ "vivek and ramesh" 

input = [ 
    {name: "vivek"},{name:"ramesh"},{name: "suresh"},{name:"ganesh"}, 
    {name: "vivek"},{name:"ramesh"},{name: "suresh"},{name:"ganesh"} 
] 
λ.(input) 
#⇒ "vivek, ramesh, suresh, ganesh, vivek etc." 
1
def convert(arr) 
    case arr.size 
    when 0 then "" 
    when 1 then arr.first[:name] 
    else  
    *first, last = arr.map { |h| h[:name] } 
    first.join(', ') << (arr.size <= 5 ? " and #{last}" : ", #{last} ..etc") 
    end 
end 

arr = [] 
convert arr #=> "" 

arr = [{name: "vivek"}] 
convert arr #=> "vivek" 

arr = [{name: "vivek"}, {name:"ramesh"}] 
convert arr #=> "vivek and ramesh" 

arr = [{name: "vivek"}, {name:"ramesh"}, {name: "suresh"}] 
convert arr #=> "vivek, ramesh and suresh" 

arr = [{name: "vivek"}, {name:"ramesh"}, {name: "suresh"}, {name:"ganesh"}] 
convert arr #=> "vivek, ramesh, suresh and ganesh" 

arr = [{name: "vivek"}, {name:"ramesh"}, {name: "suresh"}, {name:"ganesh"}, 
     {name: "dog"}, {name: "cat"}] 
convert arr #=> "vivek, ramesh, suresh, ganesh, cat, dog ..etc"