32318


Rubyで文字列型の配列の中身を、重複した文字列の最小文字列のみを抽出する方法がないか調べております。

`strArray = ["dir/a/00", "dir/a/01", "dir/a/02", "dir/a", "dir/b/00",
"dir/b/01", "dir/b/01/abc", "dir/b/01/abc/def", "dir/b/02", "dir/b"]`

このような文字列型配列があったときに、Array#uniqを使って以下の配列のように中身を削除する方法はありますでしょうか？(Array#uniqにこだわる必要はないのですが、速度が出せる書き方を教えて下さい。)

`strArray = ["dir/a", "dir/b"]`

どういうことかと言いますと、各配列要素の中身が要素の最小で一致している場合は、配列を要素の最小のみにしたいです。(比較対象は配列要素と配列要素、配列要素の中身のパスの最小ではないです。)

`"dir/a/00"は"dir/a"と比較した時に、"dir/a" + αの形になっているため削除したいです。  
(要素の最小というのは、ほかの要素と比較した時に一番小さい単位と言えば伝わりますでしょうか？)`

よろしくお願いします。


CC BY-SA 3.0
2017-02-01T08:21:54.667
32302
2017-02-02T03:08:12.253
2017-02-02T02:59:07.753
20480
20480
question
ruby
Ruby 文字列型配列の重複した文字列の最小文字列のみを抽出するには？


多分こういうことですよね？

[code]

    str = ["dir/a/00", "dir/a/01", "dir/a/02", "dir/a", "dir/b/00", "dir/b/01",  "dir/b/01/abc", "dir/b/01/abc/def", "dir/b/02", "dir/b"]
    ss = str.sort
    p ss.reduce([ss.shift]) {|m,i| i.start_with?(m.last+"/") ? m : m << i}
    
[/code]

文字列の配列として普通にソートしておき、重複しないパターンだけ抽出する、という流れで書いてみました。ディレクトリ名の一部やファイル名にマッチしないように、重複判定では
`/` を付加しています。

速くはないと思いますが、一例として。


CC BY-SA 3.0
2017-02-02T03:08:12.253
32318
2017-02-02T03:08:12.253
8000
32302
answer