2015-11-20 99 views
1

我有一對夫婦的Ruby數組:獲取數組元素值,而方括號和雙引號

array1 = ["a", "b"] 
array2 = ["a", "b", "c"] 
array3 = ["a", "b", "c", "d"] 
array4 = ["a", "b", "c", "d", "e"] 

我需要返回下列字符串:

#array1 
"a" 

#array2 
"a and b" 

#array3 
"a, b and c" 

#array4 
"a, b, c and d" 

數組的最後一個元素應永遠不會顯示。

我不知道數組中包含多少個元素或這些元素的值。

爲了實現我需要什麼,我想出了下面的方法:

def format_array(array) 
    if array.length - 1 == 1 
    array[0].to_s 
    elsif array.length - 1 == 2 
    array[0].to_s + " and " + array[1].to_s 
    elsif array.length - 1 > 2 
    array.sort.each_with_index do |key, index| 
     unless key == "e" 
     if index == array.length - 2 
      " and " + array[index].to_s 
     else 
      array[index].to_s + ", " 
     end 
     end 
    end 
    end 
end 

此方法返回與方括號和雙引號來代替瘦肉字符串值的數組。例如,我得到["a", "b", "c", "d", "e"]而不是"a, b, c and d"array4

我該如何做這項工作?

+1

你不會在數組的長度的最後返回任何字符串超過2所以返回數組排序爲是。在ruby中記住在方法中執行的最後一條語句,並對其進行評估並返回。因此,只需將生成的字符串存儲在對象中,並在最後返回。另外,我不知道你爲什麼要檢查'array.length - 1',它應該是'array.length' –

+0

感謝您的評論。按照我最初問這個問題的方式,你的答案是正確的,但用'array.length - 1'檢查沒有任何意義:我更新了問題以提供更多上下文。基本上,這是因爲我從不想顯示數組的最後一個元素。 –

回答

5
def join_with_commas_and_and(array) 
    if array.length <= 2 
    array.join(' and ') 
    else 
    [array[0..-2].join(', '), array[-1]].join(' and ') 
    end 
end 

編輯:忽略最後一個元素,添加此行的函數的第一行:

array = array[0..-2] 
+1

高爾夫球的樂趣和利潤:'array.push(array.pop(2).join'和').join','' – mwp

+0

非常感謝您的回答Amadan。這實際上是我提出的最初問題的正確答案。但是,你的回答和穆罕默德奧薩馬的評論讓我意識到我沒有提供足夠的背景。請原諒我。 –

+0

@mwp:非常好。雖然,這是破壞性的;我試圖保持原始數組完好無損。事先克隆它是一個簡單的修復,但。 – Amadan

2

我認爲這是最容易被忽視'and',直至插入逗號,然後替換最後一個逗號與'and'

def fmt(arr) 
    return arr.first if arr.size == 2 
    str = arr[0..-2].join(', ') 
    str[str.rindex(',')] = ' and' 
    str 
end 
    # ["a", "b"]: a 
    # ["a", "b", "c"]: a and b 
    # ["a", "b", "c", "d"]: a, b and c 
    # ["a", "b", "c", "d", "e"]: a, b, c and d