
配列10000個の中に次のように文字列が入っているとします。
(実際に使うのはもっとずっと長い文字列が配列内に格納されています。)
Data_Array[1] = "GRZRMZCOMKMSG"
Data_Array[2] = "DCUIROTLUMWBC"
Data_Array[3] = "RGLBMILRPBSMY"
.
.
.
Data_Array[9998] = "RSKFDHAHMOESI"
Data_Array[9999] = "AQVOXBVNILGOP"
Data_Array[10000] = "YNYRUPEXYOGFN"
配列Data_Array[10000]の中に重複文字列がないか探索したいと考えています。
~普段の手順~
配列中身を一度テキストに吐き出し、そのテキストをExcelに貼り付ける。
そして、Excelのフィルタ機能で重複文字列を排除。
その後、重複文字列を排除した文字列を保存したものをテキストファイルに保存する。
それをプログラムで読み込んで配列内に格納してから次の処理を続ける
といった、効率の悪い方法をとっています。
そこで、プログラム内で処理する方法を次のように考えてみました。
~思いつく方法~
dim DataArrayTemp[10000]
for i = 1 to 10000
flag = 0
// 重複文字がないかチェック
for j = i+1 to 10000
ifb Data_Array[i] = Data_Array[j] then
// 重複があった場合はflag = 1にする
flag = 1
break// 内ループ脱出
endif
next
// flag = 0であれば重複がない項目 (flag = 1のときは、重複がある)
ifb flag = 0 then
DataArrayTemp[temp_i] = Data_Array[i]
temp_i = temp_i + 1
endif
next
これは、力技なので配列内の量が多くなると計算時間がかかってしまいます。
ですので、重複しない文字列だけを抽出する効率の良い方法がありましたらどなたか知恵を貸してください。
No.5ベストアンサー
- 回答日時:
ハッシュ(連想配列)を使ってはどうでしょうか?
~Perlの例~
#$dataArrayTemp[0 .. 9999]には既に値が格納されていると仮定
%temp = ();
%nodup = ();
for ($i = 0; $i <1000; $i++) {
if (defined($temp{$dataArrayTemp[$i]})) {
if (defined($nodup{$dataArrayTemp[$i]})) {
push(@dups, delete($nodup{$dataArrayTemp[$i]}));
}
next;
}
$temp{$dataArrayTemp[$i]} = $i;
$nodup{$dataArrayTemp[$i]} = $i;
}
ソートすると,例えば(一般に最速と言われている)クイックソートならO(N logN)の計算量になりますが,ハッシュを使えば(少なくとも見かけ上の)計算量はO(N)で済みます。
ただ123456zennsinnさんの使っている言語(BASIC系?)にハッシュがあるかどうかは? VB.NETだとHashtableクラスとかありそうですが。
http://www.atmarkit.co.jp/fdotnet/dotnettips/125 …
No.4
- 回答日時:
↓ここ打ち間違ってました。
正しくはDim data2 As String() = CType(list.ToArray(GetType(String)), String())
No.3
- 回答日時:
以下のようにコーディングすればスッキリ書けます。
data が元データで data2 が処理後データとなります。
効率は ArrayList や Vector の実装によるので、速いかどうかはよくわかりませんが…。
オブジェクトの再拡張を防止するために、件数がわかっているならNew ArrayList(15000) とか初期容量を十分に取っておく方が望ましいです。
☆ VBなら
Dim data As String() = {"ABC", "123", "ABC", "ABCD"}
Dim list As New ArrayList
For i = 0 To data.Length - 1
If Not list.Contains(data(i)) Then
list.Add(data(i))
End If
Next
Dim data2 As String() = CType(list.ToArray(GetType,String)), String())
☆ Javaなら
String[] data = {"ABC", "123", "ABC", "ABCD"};
Vector<String> vc = new Vector<String>();
for(int i = 0; i < data.length; i ++) {
if(!vc.contains(data[i])) {
vc.add(data[i]);
}
}
String[] data2 = vc.toArray(new String[0]);

No.2
- 回答日時:
ヒントというか、私ならソートしてから比較します。
そうすると配列の前後を比較するだけで、内側のループがいらなくなりますね。
重複が1個なのか2個以上あるのかとか、配列の並びに意味があるなら、順番をどこかに保存しておかなければいけないとか細かいことは多々あると思いますがデータ量が多いなら幾分早いんじゃないでしょうか。
No.1
- 回答日時:
多分, 本質的にソートするのが最速だと思います. ソートすれば, 「重複した文字列」は必ず隣合いますからね.
可能なら直接 Data_Array を使ってソートすればいいですし, ダメでも「Data_Array への添字」の配列をソートするように書けばいい.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- Visual Basic(VBA) vbaのループ処理について 6 2022/05/06 15:35
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- Visual Basic(VBA) Vba 配列の中の特定文字列の位置の調べ方 9 2022/05/23 17:46
- C言語・C++・C# c言語について array[i]-‘0’ これってどーゆー意味ですか? (ちなみに16進数を10進数 5 2022/12/06 18:39
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
このQ&Aを見た人はこんなQ&Aも見ています
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
人生で一番思い出に残ってる靴
皆さんの人生で一番思い入れのある靴の話を伺ってみたいです。
-
一番好きなみそ汁の具材は?
みんなで大好きなみそ汁の具材について語り合おうよっ!
-
あなたが好きな本屋さんを教えてください
どのくらいの規模間で、どのような本が並んでいるか、どのような雰囲気なのかなどなど...
-
配列の重複する値とその個数を取得したい
Visual Basic(VBA)
-
VB.net 重複チェックがしたいです
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列の中に重複文字列があるか...
-
要素を削除する最適な方法
-
perlで複数行のデータを自由に...
-
vba dir の相対パス
-
VBAで巨大なファイルの途中から...
-
エクセルVBA コードが同じでも...
-
CSVが可変長の場合の検索方法
-
MATLAB グローバル変数の宣言
-
VBAでCSVファイルを途中行まで...
-
合致する番号のデータを抽出す...
-
window.open でのファイル指定方法
-
Perlのワンライナーをスクリプ...
-
batファイルでrenameができませ...
-
タブの色を変更する方法
-
Perlで特定行から特定行までを...
-
close()で例外が投げられる理由
-
Perlで特定文字列から特定文字...
-
VBAでCSVファイルの特定行を書...
-
MATLABのm-fileについて
-
C言語で特定の行を抽出する方法...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の中に重複文字列があるか...
-
perlで複数行のデータを自由に...
-
Visual C++を用いたシリアル通信
-
PerlでInline Cを使った配列の...
-
<IN>; を単独で使う
-
Pythonの再帰関数の動作の流れ...
-
pushをすると行ができる
-
時刻表を分でソートする方法を...
-
2次元の配列にデータを格納したい
-
行・列の整理! perl
-
C言語でバイナリファイルの読み...
-
単純なお問い合わせフォーム
-
perl-cgi 文字の長さでソートし...
-
C言語のバイナリモードでのfsca...
-
数字のソート
-
エクセルVBA コードが同じでも...
-
VBAでCSVファイルを途中行まで...
-
batファイルでrenameができませ...
-
awkスクリプトでダブルクォーテ...
-
ExcelをCSV書き出す場合のシー...
おすすめ情報