Rubyで配列を使ったfor文の中に条件付きのif文を入れてループさせたいのですが、基本的な構文が分かりません。
for i in array
    if i == 9
      array[i] << 'ア'
    end
end

という雰囲気で書きたいのですが、どうしたらよいでしょうか。
i番目のループまで、配列のarrayを走査するにはどうすればよいでしょうか。
基礎的な質問ですみません。よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

array = [1,2,3,4,5]



array.each_with_index do |value,index|
if index == 1 then
puts value # => 2
end
end

indexが0からスタートするのに注意
    • good
    • 0

=begin


ANo.1で他の方が指摘されている通り、次の2点を注意事項として挙げておきます。
・Rubyを使う際にはforよりeach系ブロック構文を利用する。
・配列操作中に対象配列の破壊的操作は避ける

>i番目のループまで、配列を走査する
以降はこれに絞った上でいくつか書いてみます。
尚、動作確認環境は Ruby1.8.7 です。
=end

array = %w[a b c d e]
goal = 3 # これが「i」です。

array.each_with_index do |value, index|
break unless index < goal
puts value
end

puts '-----------'

goal.times do |index|
puts array[index]
end

puts '-----------'

# RubyのArrayに於けるindexは0から始まるため、今回の様な「i番目」にuptoは向かない
# (「indexがiまで」であれば、こちらの方が良い)

0.upto goal do |index|
puts array[index]
end
    • good
    • 0

配列を0番目の要素から順に見ていくというのなら、以下で如何でしょうか。



array = %w(a b c d e)
p array # => ["a", "b", "c", "d", "e"]
for i in (0...array.size)
if i == 3
array[3] << 'z'
end
end
p array # => ["a", "b", "c", "dz", "e"]


array.sizeで配列の要素数を取得して
(0...array.size)で、0番目から要素数-1までの範囲という意味になります。
    • good
    • 0

配列のarrayを走査には、



array = ["abc","def"]
array.each { |i|
puts i
}
のように、eachを使うのが一般的だと思います。(上記は配列の各要素を表示するもの)
rubyでは、for構文より、eachメソッドの方をよく使います。

ただ、質問のように、走査中の配列に、要素を追加するのは、どの言語でも止めたほうがいいです。
追加した要素がループ中にどうなるのか、予想のつかないことが起きることが多いです。

質問のように、配列のn番目に要素を追加したいのであれば、

array.insert(2,"gh")

のようにinsertを使うのがよいと思います。

操作中の配列に要素を追加したいような場合は、そのまま追加するのではなく、別の配列を用意して追加してもよいでしょう。

rubyのArrayクラスの詳細をより知りたい場合はリファレンスマニュアルを参照してください。
http://www.ruby-lang.org/ja/man/html/Array.html
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報