2017-10-02 13 views
-1

配列の配列から特定の行を削除したいと思います。データは次のようになります。Ruby:配列の配列から削除

[ 
    ["Name1", "Email1", "Type1"], 
    ["Name1", "Email1", "Type2"], 
    ["Name1", "Email1", "Type3"], 
    ["Name2", "Email2", "Type3"], 
    ["Name2", "Email2", "Type4"] 
] 

"Type1"または "Type2"の場合、残りのすべての行は同じユーザー名で削除する必要があります。タイプが、例えば、 "Type1"または "Type2"では、行は配列内にとどまるはずです。つまり、結果の配列は次のようになります。

[ 
    ["Name1", "Email1", "Type1"], 
    ["Name2", "Email2", "Type3"], 
    ["Name2", "Email2", "Type4"] 
] 

アレイをループする前に、配列はユーザ​​ー名でソートされます。

inputfile_content.each.with_index do |inputrow, index| 
    if (index + 1) != inputfile_content.length 
    if inputrow[0] == inputfile_content[(index + 1)][0] 
     if ["Type1", "Type2"].include?(inputrow[2]) 
     inputfile_content.delete_at(index + 1) 
     end 
    end 
    end 
end 

しかし、明らかにそれが完全に働いていない、それだけで次の配列のエントリではなく、同じユーザ名のすべてのオカレンスを削除します。私は現在使用しているコーディングはこれ一つです。誰でも手掛かりをどのようにこれを修正するには?入れ子にされたinputfile_content.eachまたはもっとエレガントな方法がありますか?

+0

行は何ですか?行とは何ですか? '型'とは何ですか? 'username'とは何ですか? – sawa

+0

申し訳ありませんが、私はあなたの質問を理解していません。行と行の間に違いはありますか?これはどういうわけか私が尋ねた質問に属していますか?同じことが型とユーザー名にも当てはまります。 とにかく、答えは非常に簡単だった: 'inputrow [0] == inputfile_content [(インデックス+ 1)] [0] inputfile_content.delete_at(インデックス+ 1) end' – thbe

+0

「差とがありますが行と行 " - それは私があなたに求めている質問の一部です。残りは同じことが言えます。 – sawa

答えて

-1

ではなく、単一の削除のループで解決:

while inputrow[0] == inputfile_content[(index + 1)][0] 
    inputfile_content.delete_at(index + 1) 
end 
+2

あなたは明らかにしていませんが、私は 'inputfile_content'があなたが示した配列であると仮定しています。あなたの答えがあなたの特定の例のために働くかどうかわからない、それが偶然であれば。まず、 'index'が最後に到達すると、' inputfile_content [(index + 1)] 'は' nil'になり、 '[0]'を呼び出すとエラーが発生します。次に、反復処理中に 'delete_at'を呼び出すのは一般に間違っています。 – sawa

+0

確かに、 "inputfile_content"は配列の配列です。 "putrow'は、これが明白で、単一の配列だと思いました。 'nil'の状況に関しては、元のループを見て、ループの終わりの状況は既に' if(index + 1)!= inputfile_content.length'でカバーされています。したがって、 '[0]'が 'nil'であるという状況は決してありません。さらに、私はループ内で 'delete_by'を使用すべきではない理由を理解していません。何が良い方法でしょうか?入力ファイル内の配列の配列は動的に生成されるため、ユーザー名ごとにどれだけの行を削除する必要があるのか​​予測できません。 – thbe

関連する問題