スペース区切りのAND検索の実装方法

このQ&Aのポイント
  • JavaのSwingアプリケーションで、スペース区切りのAND検索機能を実装する方法について教えてください。
  • button1を押すと、テキストファイルからtext1に入力された文字列をスペースで区切ってAND検索し、検索結果をarea1に表示させる機能の実装方法について教えてください。
  • String[] strAry2 = data2.split(" ");を使用してforループで回す方法を試しましたがうまくいきませんでした。
回答を見る
  • ベストアンサー

スペース区切りのAND検索

private void button1ActionPerformed(ActionEvent evt) { String data1 = area1.getText(); String data2 = text1.getText();     if(data1.length()>0){       area1.setText("");       String[] strAry = data1.split("\r\n"); for(int i = 0; i<strAry.length; i++){ if (strAry[i].indexOf(data2)!=-1)area1.append(strAry[i] + "\r\n"); } }else{ area1.setText(""); } } 上記は、button1を押すとtext1に書かれた文字列をテキストファイルの 中から検索し、area1に検索結果を表示させるものです。 text1に文字列が一つだけ書かれている場合は、これで良いのですが スペースで区切った文字列を全て含む、複数検索(AND検索)の場合は どうなるのでしょうか?(例:晴れ 天気) 苦し紛れにString[] strAry2 = data2.split(" ");をつくり forで回そうとしましたが、だめでした・・(or検索ではないですもんね)。 どうか良いお知恵をお貸しください。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • yuripppe
  • ベストアンサー率100% (2/2)
回答No.1

こんにちは。 例の状況としては以下でしょうか? (1)対象ファイルは1つ (2)その中で複数キーワードに一致する行を抽出したい 上の状況で合っているとすれば、 1. キーワードを区切り文字(空白など)で分解する 2. 1の1つのキーワードでファイルを検索し、 検索された行番号を保持 (行番号はfor文なんかの繰り返し回数なんかでいいかと。) 3. 2で検索した以外のキーワードで、保持した行番号に 対応する文字列をさらに検索する。 4. 3の行番号を保持する。 3.4を繰り返す。 こんな感じでどうでしょうか。

参考URL:
http://www.atmarkit.co.jp/fcoding/articles/algorithm/07/algorithm07a.html
charlie_rt
質問者

お礼

ありがとうございます、状況はまさにその通りです。 大変参考になりました。がんばってみます・・

関連するQ&A

  • 添え字を使用したIF文の書き方について。

    QNo.7510971ご質問していた原因が分かりましたので ご報告いたします。 QNo.7481482で解決致しましたテキスト入出力をする際 arrayline[7] = "住所漢字";のテキストデータに スペースがない文字列の領域からテキストアウト出来なかったことが 判明しました。 >入力される住所は、予め全角空白「 」で必ず区切られているのですか? もしそうでないとすると、「住所の途中や番地の途中で区切らない」を自動で判断するのは困難です。 の問いに対して 全角空白「 」で必ず区切られていると 報告してしまったのですが 例外でスペースがなくすべて全角80桁で埋まっている場合は 4等分つまり20文字ずつ設定しなければならなかったのですが・・・ この時点でこの作業は成立しませんでしょうか?? 例えばIF文で、全角スペースがない場合は20文字ずつ4等分に することは出来ないのでしょうか?? それとQNo.7510971でご質問した際 String addr = "aaaaaaaaa bbbbbbbbbb cccccc ddddddddddddddd eee ffffff"; String[] strAry = addr.split(" "); (A) strAry[1]がnullなら終了。 (B) strAry[0]の長さとstrAry[1]の長さの和が19以上のときは(E)へ。 (C) strAry[0]に、strAry[0]+" "+strAry[i+1]を代入する。strAry[1]にstrAry[2]を代入、strAry[2]にstrAry[3]を代入、…のようにstrAry[]の要素を前に詰める。strAry[]の最後の要素にはnullを入れる。 (D) (A)に戻る。つまり、strAry[0]の長さが20を超えない範囲で、どんどんstrAry[1]以下の文字列をstrAry[0]に連結していく。 (E) 配列の添字を1ずつ増やした状態で(A)~(D)の内容を繰り返す。 のような提案を頂いて 現在少しずつ検証を行っている最中ですが strAry[0]の長さとstrAry[1]の長さの和が19以上のとき の構文が書けません。 String str = new String(住所漢字); String[] strAry = str.split(" "); String cuttmp = null; // strAry[0] と strAry[1]の和が19文字を超える(20文字以上なら) if(○○○○○○○○○○ .length()<19 ){ cuttmp = ((○○○○○○○○○○)); の○○の部分は if(strAry[0]+strAry[1].length()<19 ){ とかですと エラーになります。 そのた色々と試したのですが どんな感じで考えていけばよろしいのでしょうか?? どうぞよろしくお願い致します。

    • ベストアンサー
    • Java
  • javaで絵チャットを作っています。

    初めての投稿です。よろしくお願いします。 javaで絵チャットを作っているのですが、うまく片方で書いた絵をもう片方に送って描画することがうまくいっていません。 一応、チャットはうまくいって入るのですが。。。。。座標を一度文字列に直してチャットの文字列と区別するのに座標は文字列の頭に%%%をつけて送信しています。 教えてください。よろしくお願いします。 /ChatServer/ /* 引数の文字列を全てのチャネルに出力する */ synchronized void broadcast(String s) { int i, n; MyChannel mchannel; // 全チャネルに対して文字列を送信 for (i = 0, n = channelSet.size(); i < n; i++) { mchannel = (MyChannel) channelSet.get(i); // チャネルが有効なら送信、無効ならチャネルを除去 if (mchannel.alive) { if(s.startsWith("%%%")) mchannel.sendObj(s); else mchannel.sendStr(s); } else { channelSet.remove(i); i--; n--; }} /ChatClient/ getContentPane().add(input = new JTextField(), BorderLayout.SOUTH); // 送信処理 input.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { String s = input.getText(); input.setText(""); try { // 改行文字を\r\nに統一する if (s.endsWith("\r\n")) { wt.write(s, 0, s.length()); } else { if (s.endsWith("\n")) { wt.write(s, 0, s.length() - 1); } else { wt.write(s, 0, s.length()); } wt.write('\r'); wt.write('\n'); } // バッファをフラッシュする wt.flush(); } catch (IOException e) { new RuntimeException(); }}}); // 受信処理 public void run() { String str; try { while (true) { str = rd.readLine(); System.out.println(str);// 確認用 /* 座標の要素かテキストの要素かを判定する */ /* 座標を操作 */ if (str.startsWith("%%%")) { String[] strAry = str.split(","); // 分割された文字列の表示 for (int i = 0; i < strAry.length; i++) { System.out.println(strAry[i]); } /* Stringをint型に変換 */ mc.mode = Integer.parseInt(strAry[1]); mc.PX = Integer.parseInt(strAry[2]); mc.PY = Integer.parseInt(strAry[3]); mc.x = Integer.parseInt(strAry[4]); mc.y = Integer.parseInt(strAry[5]); mc.RX = Integer.parseInt(strAry[6]); mc.RY = Integer.parseInt(strAry[7]); repaint(); } else { log.append(str + '\n'); log.setCaretPosition(log.getText().length());// スクロールバーを手動で下げる } } } catch (IOException e) { new RuntimeException(); } /MyCanvas/ public void sender() { // サーバとチャンネルに送信する try { /* intをStringに変換 */ String strmode = String.valueOf(mode); String strPX = String.valueOf(PX); String strPY = String.valueOf(PY); String strX = String.valueOf(x); String strY = String.valueOf(y); String strRX = String.valueOf(RX); String strRY = String.valueOf(RY); String Zahyou = new String("%%%" + "," + strmode + "," + strPX+ "," + strPY + "," + strX + "," + strY + "," + strRX + ","+ strRY); System.out.println(Zahyou); mchnl.sendObj(Zahyou); } catch (Exception e) { new RuntimeException(); }} /MyChannel/ /* クライアントへ文字列を出力する */ synchronized void sendStr(String str) { //System.out.println("sending String info from server to client"); try { // 改行文字を\r\nに統一する if (str.endsWith("\r\n")) { wt.write(str, 0, str.length()); } else { if (str.endsWith("\n")) { wt.write(str, 0, str.length() - 1); } else { wt.write(str, 0, str.length()); } wt.write('\r'); wt.write('\n'); } wt.flush(); } catch (IOException e) { disconnect(); } } /* クライアントへ座標を出力する */ synchronized void sendObj(String Zahyou) { try { if(Zahyou.endsWith("\r\n")){ wt.write(Zahyou, 0, Zahyou.length()); }else{ if (Zahyou.endsWith("\n")) { wt.write(Zahyou, 0, Zahyou.length() - 1); } else { wt.write(Zahyou, 0, Zahyou.length()); } wt.write('\r'); wt.write('\n'); } wt.flush(); } catch (IOException e) { disconnect(); } } /* クライアントからの入力を受け付ける */ public void run() { String str; InputStreamReader in; try { // ソケットから入出力ストリームを得る rd = new BufferedReader(new InputStreamReader(socket.getInputStream())); wt = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // ユーザー名を入力してもらう sendStr(" 名前を入力してください "); handle = rd.readLine(); // 入力待ちのループ while (true) { // 文字列入力を待つ str = rd.readLine(); /*座標の要素かテキストの要素かを判別*/ if (str.startsWith("%%%")) {chatsv.broadcast(str); } else chatsv.broadcast("[" + handle + "] " + str); }

  • スペース区切りの絞込検索

    現在CSVファイルを利用した簡易検索を作っています。 他の質問にも似たようながありましたがsqlの知識もなく理解できなかったので新規で質問致しました。 複数のキーワードをどうしてもスペース区切りでの絞込検索ができなく悩んでいます。 大変恐縮ですが、お知恵をお借りできればと思い 書き込みさせていただきました。 現在自分で書いたコードは下記です。 大変お手数ですがお教えいただけると幸いです。 宜しくお願い致します。 <?PHP $KeyWord=$_GET["key"]; $ArrKeyword=explode(" ",$KeyWord); $f = 0; $Data=file("data.csv"); for($i=0;$i<sizeof($Data);$i++){ $line=$Data[$i]; for($n=0;$n<sizeof($ArrKeyword);$n++){ //このあたりが理解できていません・・ if(mb_eregi($ArrKeyword[$n],$line)){ $lines = $line; } $kensaku_kekka[$f] = $lines; $f = $f+1; break; } } print_r($kensaku_kekka); ?>

    • ベストアンサー
    • PHP
  • エラーで式の開始が不正ですと出ます。

    質問内容 課題 ・ファイル student.txt に学生データ(学籍番号、氏名、所属学部)が入っている。 ・半角文字で学籍番号を入れて、検索ボタンを押すと、氏名と学部が表示される。 ・存在しない学籍番号を入れて、検索ボタンを押すと、「該当なし」が表示される。 ・ファイル student.txt の内容。  学籍番号 氏名 学部の間は半角スペースで区切る。 0521201 金城花子 文学部 0533101 守山春子 生活環境学部 0561101 大森夏子 人間科学部 0552130 名城秋子 現代文化学部 0571201 鶴舞冬子 薬学部 プログラムソース↓ import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; class kadai2Frame extends JFrame { private JTextField tf1,tf2,tf3; public kadai2Frame() { setSize(200,100); addWindowListener(new WindowAdapter() { // ×クリック時の終了処理 public void windowClosing(WindowEvent e) { System.exit(0); } }); Container c=getContentPane(); c.setLayout(new GridLayout(4,2)); // グリッドレイアウト4 行2 列を指定 c.add(new JLabel("学籍番号")); // 最初のラベルを作成して[名前]と表示 c.add(tf1=new JTextField("",8)); c.add(new JLabel("氏名")); // 最初のラベルを作成して[名前]と表示 c.add(tf2=new JTextField("",8)); c.add(new JLabel("学部")); // 次のラベルを作成して[年齢]と表示 c.add(tf3=new JTextField("",8)); JButton bt; c.add(bt=new JButton("検索")); // ボタンbt を作成して[検索]と表示 bt.addActionListener(new ActionListener() { // ボタンbt のリスナーを登録 public void actionPerformed(ActionEvent e) { // ボタンが押された時 string s6 = tf1.getText(); if(s1.equals(s6)){tf2.setText(str1Ary[1]); string s6 = tf1.getText(); if(s2.equals(s6)){tf2.setText(str2Ary[1]); string s6 = tf1.getText(); if(s3.equals(s6)){tf2.setText(str3Ary[1]); string s6 = tf1.getText(); if(s4.equals(s6)){tf2.setText(str4Ary[1]); string s6 = tf1.getText(); if(s5.equals(s6)){tf2.setText(str5Ary[1]); } public static void main(String[] args) { JFrame w=new kadai2Frame(); w.setVisible(true); try{ BufferedReader br = new BufferedReader(new FileReader("student.txt")); } catch (FileNotFoundException e) { String str1 = br.readLine(); String str2 = br.readLine(); String str3 = br.readLine(); String str4 = br.readLine(); String str5 = br.readLine(); String[] str1Ary = str1.split(" "); for (int i=0; i<str1Ary.length; i++) { System.out.println(str1Ary[i]); } String[] str2Ary = str2.split(" "); for (int i=0; i<str2Ary.length; i++) { System.out.println(str2Ary[i]); } String[] str3Ary = str3.split(" "); for (int i=0; i<str3Ary.length; i++) { System.out.println(str3Ary[i]); } String[] str4Ary = str4.split(" "); for (int i=0; i<str4Ary.length; i++) { System.out.println(str4Ary[i]); } String[] str5Ary = str5.split(" "); for (int i=0; i<str5Ary.length; i++) { System.out.println(str5Ary[i]); } String s1 = "str1Ary[0]"; String s6 = "tf1"; String s2 = "str2Ary[0]"; String s3 = "str3Ary[0]"; String s4 = "str4Ary[0]"; String s5 = "str5Ary[0]"; } } }); } } 以上です。誰か教えてください!!(ToT)

    • ベストアンサー
    • Java
  • Vectorと配列

    お世話になります。 GUIから3つのString文字列を受け取り、追加ボタンを押した時点でVector(List)に格納し、登録ボタンを押してはじめてDBにデータを格納させたいのですが、 Vector list = new Vector(); String addData[] = {txta.getText(), txtb.getText(), txtc.getText()}; for(int i=0; i<addData.length; i++){ list.addElement(addData[i]); } しかし、連続してデータを追加するとlistには {data1,data2,data3,data4,data5,data6} のように入ってしまいます。 これを {data1,data2,data3} {data4,data5,data6} のようにlistに格納するにはどうすればいいでしょうか? ご教授頂ければ幸いです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javascriptの配列の検索について

    テキストエリアに入力された文章を、改行ごとで配列に格納 その後、特定の文字を検索し、特定の文字がある配列を見つけて 見つかったものに処理をかけたいです 現在、配列に格納するところまでできているのですが、その後の文字を検索するところで躓いてます。 配列をmatchで検索すると一番最初の配列にのみ処理をかけてしまっているのが現状です。 どなたかお知恵を貸していただけないでしょうか よろしくお願いします。 例 入力された文字列:                明日の時刻のお知らせ                開始時間:10時30分                受付開始は10時00分からとなっております。                遅れないようにお願いいたします。 検索する文字:  時間     ↓ 検索ワードを含む配列:開始時間:10:30     ↓これに処理かけて 出力:10:30 検索ワードが見つからない場合 出力:10:00 10:30 という形にしたいです。 プログラムは下記のように組みました。 //////////////////////////// <html> <head> <script language="JavaScript"> function tester(){ var str= document.getElementById('input_text').value; var time; var alltime; abc = str.split(/\r\n|\r|\n/); var g = ["開始時間"]; for (var i=0;i<abc.length;i++){ if(abc[i].match(g)){ time = abc[i].match(/\d{1,2}:\d{1,2}/g); if(time2 !=null){ alert(time); document.write(time); break; } }else{ alltime = str.match(/\d{1,2}:\d{1,2}/g); if(alltime !=null){ document.write(alltime); } }break; } } </script> </head> <body> <textarea id=input_text rows="10" cols="45"> </textarea><br> <input type=button onclick="tester()" value="start"> </body> </html>

  • ご教授願いたいのですが・・・

     今初めてのプログラミング言語としてJava言語を使用して勉強しています。そんななか2次元配列のところで分からないところがありまして、現在ちょっとストップしています。もしよろしければご教授お願い致します。  下記のプログラムを組んだ際に、for文から抜けずに満足する結果が出てきません。  分かりやすいように解説して頂けますとありがたいです。 <ren19> public class ren19 { public static void main(String args[]) { int i,j; String strAry[][] = new String[3][2]; strAry[0][0] = "その1"; strAry[0][1] = "10"; strAry[1][0] = "その2"; strAry[1][1] = "50"; strAry[2][0] = "その3"; strAry[2][1] = "60"; for(i=0;i<strAry.length;i++) { for(j=0;j<strAry.length;j++) { System.out.println(strAry[i][j]); } } } } <出力される結果> その1 10 <求める結果> その1 10 その2 50 その3 60

  • スペース区切りの検索について

    現在PHP+CSVで簡易検索を作りましたが この度それをMYSQLで実現させようかと考えていますが 以前のような単純なCSV検索と同様の事が MYSQLのwhere句の部分で表現できなく困っています。 ■data.csv 鈴木一郎,野球選手,東京都新宿区 鈴木次郎,サッカー選手,東京都新宿区 検索方法(andで絞込み) キーワードを何も入れなければ全件出力。 たとえば検索キーとして 「鈴木」 「野球」と入れれば1行目が表示されるイメージです。 ■PHP+CSV $ArrKeyword=explode(" ",$KeyWord); $Data=file("data.csv"); for ($i = 0; $i < sizeof($Data); $i++) { for ($n = 0, $flag = 1; $n < sizeof($ArrKeyword); $n++) { if (!mb_eregi($ArrKeyword[$n], $Data[$i])){ $flag = 0; break; } } if ($flag) { $kensaku_kekka[] = $Data[$i]; } } ■MYSQL $ArrKeyword=explode(" ",$KeyWord); $where = " WHERE concat(name,com,jyusho) Like '%$ArrKeyword[0]%' "; if($ArrKeyword[1]){ for($i = 1; $i < sizeof($ArrKeyword); $i++) { $where .= "AND (concat(name,com,jyusho) like '%$ArrKeyword[i]%' )"; } } $sql = "SELECT * FROM `keigyou_tbl` $where"; //select文を実行 if(!$res=mysql_query("$sql")){ echo "sql失敗"; exit; } ■MYSQL版の場合2個目のキーワードが機能していません。

    • ベストアンサー
    • MySQL
  • forループを使うと上書きされてしまう・・・・

    NetBeansを使ってJAVAでツールを作っているのですが、 ループ作業でうまくいかないところがあります。 内容は テキストフィールドで入力された項目を、 全て別の画面で表示するというものです。 テキストフィールドを20個設置して、item配列をgetText()で作って それをforループで上から順番に表示しようとしているのですが、 結果を表示すると最後の一つしか表示されません。 ループが回る度に上書きされて最後しか残らないのだと思うのですが 全部表示する方法はないでしょうか? ↓ String[] item = new String[20];  //配列にまとめてます item[0] = item1.getText(); item[1] = item2.getText(); item[2] = item3.getText(); item[3] = item4.getText();  ・  ・省略  ・ item[18] = item19.getText(); item[19] = item20.getText(); for (int i=0; i<21; i++)        //ループで上から20項目表示しようとしてます items.setText(item[i] + "\n"); どんなことでもいいので情報をもらえると助かります。

    • ベストアンサー
    • Java
  • アプリケーション

    初歩的な質問ですが下のプログラムを書いたのですが表示されませんでした。下のプログラムのどこが間違ってますか? これが問題です。 ・フレームに部品を配置するプログラムを作成しなさい。  BorderLayoutによりボタン1,テキストエリア,ボタン2が配置  ボタン1をクリックするとテキストエリアに文字を埋める  ボタン2をクリックするとテキストエリアをクリアする import java.awt.*; import java.awt.event.*; class MyFrame extends Frame implements ActionListener { TextArea txtar1; Button btn1, btn2; public MyFrame(String title) { super(title) ; // タイトル設定 addWindowListener(new WindowAdapter(){// 閉じるボタン対応 public void windowClosing(WindowEvent e){ System.exit(0); } }); } public void init(){ setLayout(new BorderLayout(5,5)); // 文字列表示のボタンをBorderLayoutの北に配置 btn1=new Button("文字列表示"); add(btn1,BorderLayout.NORTH); txtar1 = new TextArea(); add(txtar1,BorderLayout.CENTER);// テキストエリアをBorderLayoutの中央に配置 btn2=new Button("文字列クリア"); add(btn2,BorderLayout.SOUTH); // 文字列クリアのボタンをBorderLayoutの南に配置 } public void actionPerformed (ActionEvent e) { // ボタン押下対応 if (e.getSource() == btn1) { txtar1.setText("AAAAAAAAAA\nBBBBBBBBBB\nCCCCCCCCCC\n"); } else if (e.getSource() == btn2) { txtar1.setText("");   }  } } public class JaFram { public static void main(String args[]) { MyFrame frm = new MyFrame("フレームテスト"); frm.setSize(300, 200); // 窓サイズを横300,縦200にする frm.setVisible(true) ; // フレームを表示する  } }