K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[167] 配列で問題が・・
投稿者:神奈川
2007/02/20 02:13:25

ツリーがあまりに長くなってしまったので新しく投稿させていただきました。 現在,配列の格納の仕方で迷っています。 下にプログラムを表記します。 import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; import java.io.*; public class Q extends DefaultHandler { public static void main(String[] argv) { BufferedReader br = null; String fname; int l=0; int k=0; String[] topfname=new String[10]; //キーワードとなる文字列 String[] r={"空"}; try { br = new BufferedReader ( new InputStreamReader ( new FileInputStream( "fname1.txt" ), "SJIS" ) ); //ここでfname1.txtに表記されているファイル名を順番(1行ずつ)に抽出 while( ( fname = br.readLine() )! = null) {              //XML検索で抽出プログラムを呼び出し KnowledgeExtract myKnowledgeExtract=new KnowledgeExtract();              //ファイル名とキーワードを送り,戻り値として真偽を取得 boolean xxx=myKnowledgeExtract.Ext(fname,r) ; System.out.println(xxx+" "+"top:"+fname); //ここが問題点・・       if(xxx){topfname[l]=fname;l++;}else{} } } catch( Exception ex ) { ex.printStackTrace(); } //truuになったファイル名を表示 for (int i=0; i < topfname.length ; i++) System.out.println("topfname:"+topfname[i]); } ここでは、真となるファイル名のみをtopfnameの配列に格納したいのですが 配列の長さも真となるファイルの個数になるようにしたい。 現在の状態だと、topfnameのサイズを「10」と定義しているので、これをなんとか 真となるファイルの個数をサイズにしたいのですが、どのようにすればよいでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[169] Re:配列で問題が・・
投稿者:(ぱ)
2007/02/20 02:13:25

「飲み会以外では飲まない」という軟弱な断酒中ですが、木曜の晩は飲み会で、 日付が変わる頃帰宅して風呂に入って、朝の5:00頃目がさめました。風呂の中で。 というわけで昨晩も帰宅後即寝てしまったので返事が遅れましてすみません。 # ていうか他のどなたかが答えてくれてもいいような… >ここでは、真となるファイル名のみをtopfnameの配列に格納したいのですが >配列の長さも真となるファイルの個数になるようにしたい。 >現在の状態だと、topfnameのサイズを「10」と定義しているので、これをなんとか >真となるファイルの個数をサイズにしたいのですが、どのようにすればよいでしょうか? Javaの配列は拡張できないので、java.util.ArrayListクラスあたりを 使えばよいでしょう。 で、最終的に配列が欲しければ、 String[] s = (String[])arrayList.toArray(new String[0]); で変換します。 このへんのことは「Java謎+落とし穴徹底解明」のp.329あたりに書いてあります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[175] ファイルについて
投稿者:神奈川
2007/02/20 02:13:25

>「飲み会以外では飲まない」という軟弱な断酒中ですが、木曜の晩は飲み会で、 >日付が変わる頃帰宅して風呂に入って、朝の5:00頃目がさめました。風呂の中で。 >というわけで昨晩も帰宅後即寝てしまったので返事が遅れましてすみません。 いえいえ,こちらこそお世話になっているので、ありがとうございます。解決できました。 ふぃよかったです。 件名を変更しました。 今度は、txtファイルの読み込みと書き込みについて質問なんですが、 一つ目の質問です。 ******aaa.txt****** ねこ こねこ いぬ 哺乳類 爬虫類 とかげ ******************* この場合4行目のみ読み取るためにはどうすればよいのでしょうか? ちなみに //文字ストリーム作成 br=new BufferedReader ( new InputStreamReader ( new FileInputStream( "aaa.txt" ), "SJIS" ) ); //読み込み、ついでにreadLine()は、1行ずつ見る。1回目とおれば、1行目2回通れば2行目 String AAA=br.readLine() String BBB=br.readLine() この場合、AAAは、1行目の「ねこ」がはいります。 BBBには、2行目の「こねこ」がはいります。 4回ループを起してから抽出する事は可能ですが、 最初2行目 次4行目 次1行目 を読み取るとなると、readLine()は、よくわからないけど1行目ずつ格納してしまうので 4行目の次に1行目を見るというのは、どうも難しいような気がwします。 何か、行数を指定してその行を読み取るメソッドは、あるでしょうか? 無い場合は、行数を初期化(1行目から)すればいいんでしょうが、どうすればいいのかわかりません・・ 二つ目の質問です。 やりたいことは、書き込みと読み込みを同じファイルから行いたいことです。 それを踏まえた上で、 例えばaaa.txtにたいして最初に1:ネコという書き込みがされ 1ステップ(書き込み)    ******aaa.txt******    1:ねこ    ******************* 2ステップ(1行目読み込み) 3ステップ(書き込み)    ******aaa.txt******    1:ねこ    1-1:こねこ    1-2:いぬ    ******************* 4ステップ(2行目読み込み) 5ステップ(書き込み)    ******aaa.txt******    1:ねこ    1-1:こねこ    1-2:いぬ    1-1-2:哺乳類    1-1-3:爬虫類    1-1-4:とかげ    ******************* 6ステップ(3行目読み込み) 7ステップ(書き込み内容なし) と繰り返し 最後(読み込んだ文字列=null)になって終了 というふうにしたいのです。 書き込んでいる最中に読み込めるのでしょうか? この場合、読み込みの後に別の処理があるのですが、これについては できていて、文字列が入力されると0~複数の文字列が出力される。という感じです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[176] Re:ファイルについて
投稿者:(ぱ)
2007/02/20 02:13:25

>今度は、txtファイルの読み込みと書き込みについて質問なんですが、 APIリファレンスを見ると、InputStreamReaderにはmarkとresetという メソッドがありますが、markSupportedはfalseのようなので使えませんね。 よって、対象とするファイルがよっぽど巨大なのでなければ、 「最初にいったん全部読み込んでメモリに載せ、いったんclose()し、  処理が全部すんだらまとめて書き出す」 という方法で良いんじゃないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[181] Re:ファイルについて
投稿者:神奈川
2007/02/20 02:13:25

>>今度は、txtファイルの読み込みと書き込みについて質問なんですが、 > >APIリファレンスを見ると、InputStreamReaderにはmarkとresetという >メソッドがありますが、markSupportedはfalseのようなので使えませんね。 > >よって、対象とするファイルがよっぽど巨大なのでなければ、 >「最初にいったん全部読み込んでメモリに載せ、いったんclose()し、 > 処理が全部すんだらまとめて書き出す」 >という方法で良いんじゃないでしょうか。 返信送れてしみません。。確かにこの方法しかないようですね。。 これでやってみます。 新たな質問です。 文字列が String[] a={"あい","うえ","お","かか","きき","こ"} String[] b={"あい","け","お","こ","ちち","た"} と二つあるとき,bに対してaの文字列を引いた文字列 だけを取得するためのサンプルプログラム作成しようと思っているのですが この場合は、結果的に{"け","ちち","た"}のみになります。 以下にプログラムを書きました。 しかしLinkedHashsetやSetなどのシンボルが解決できないとというエラーが 起こってしまいました。 もしよろしければ正しく直していただけるとうれしいのですが、 また最後の値{"け","ちち","た"}を配列に格納したいのですが それも含めて宜しくお願いします。 import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; import java.io.*; public class www extends DefaultHandler { public static void main(String[] args) { String[] a = {"あい","うえ","お","かか","きき","こ"} ; String[] b = {"あい","け","お","こ","ちち","た"} ; Set setA = new LinkedHashSet(Arrays.asList(a)); Set setB = new LinkedHashSet(Arrays.asList(b)); setB.removeAll(setA); Iterator it = setB.iterator(); while (it.hasNext()) { System.out.println(it.next()); } }
[この投稿を含むスレッドを表示] [この投稿を削除]
[182] Re:ファイルについて
投稿者:(ぱ)
2007/02/20 02:13:25

>しかしLinkedHashsetやSetなどのシンボルが解決できないとというエラーが >起こってしまいました。 LinkedHashSetやSetはjava.utilパッケージにありますから、 importしなければそうなって当たり前です。 SAXなどのパッケージはimportしているわけですから、神奈川さんがimportの 何たるかを知らないとは考えにくいのですが、それでなぜ、java.utilの importを忘れるのかが不思議です。書き忘れるのは別に不思議じゃないですが、 このエラーメッセージを見れば一目瞭然です。 もしかして神奈川さんが、importの何たるかがわかっていなくて、 ネットに落ちてるコードとかを拾い集めてここまでプログラムを書いたのだとすれば、 それはそれでたいしたものではありますが、やっぱり勉強の順番がおかしいように 私には思えます。 >また最後の値{"け","ちち","た"}を配列に格納したいのですが 配列に格納したいのなら、すればよいのでは?
[この投稿を含むスレッドを表示] [この投稿を削除]
[183] Re:ファイルについて
投稿者:神奈川
2007/02/20 02:13:25

>>しかしLinkedHashsetやSetなどのシンボルが解決できないとというエラーが >>起こってしまいました。 > >LinkedHashSetやSetはjava.utilパッケージにありますから、 >importしなければそうなって当たり前です。 すみません(TOT) ioのパッケージに含まれいるものだと思っていました。 変な勘違いをしていました。何してんだ私・・・ とりあえず解決は、しました。よくよく考えれば当たり前なのに・・
[この投稿を含むスレッドを表示] [この投稿を削除]
[187] XMLについて
投稿者:神奈川
2007/02/20 02:13:25

件名を変更しました。 またXMLで解らない事が出てきてしまいました・・・ 問題例を以下に記述します。 ---あ.xml---- <愛 id=1>   <b>     <c>     </c>   </b>     <愛 ID=2>     </愛> </愛> ------------ 特定のタグの属性の下に -- <k>  <愛 ID=7>あああ</愛>   </k> を記述しそのタグ<愛>に属性を与えるというプログラムです。 ☆例えば、あ.xmlの<愛 ID=2>の下に <k>  <愛 ID=7>あああ</愛>   </k> を加えたりするなどです。 ここで問題なのは、属性を作成するとエラーが発生してしまうということです。 以下に自作したプログラムを記述します。 static void selectionAppend() throws Exception { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new FileInputStream("あ.xml")); NodeList list = doc.getElementsByTagName("愛"); for (int i = 0; i < list.getLength(); i++) { Element node = (Element)list.item(i); if (!(node instanceof Element)) continue; String value = ((Element)node).getAttribute("ID"); //ここで対象属性名を指定し if (value != null && value.equals("2")) { //ここで対象属性値を指定する Node child1 = doc.createElement("k"); Node child2 = doc.createElement("愛"); //↑ここのタグに属性を追加したい、setAttribute("ID", "7");このメソッドを代入する //のでしょうがどのように代入すればよろしいでしょうか。 Node child3 = doc.createTextNode("あああ"); child2.appendChild(child3); child1.appendChild(child2); node.appendChild(child1); //↑ここでツリー構成は完了していることになるのでしょうか?できたとしたら、 //NodeList know = node.getElementsByTagName("愛"); //Element knowe = (Element)know.item(0); //knowe.setAttribute("No", "8"); //こうするのでしょうが、 //解らなくなってしまったので、また質問しにきました。宜しくお願いします。 } } FileOutputStream out = new FileOutputStream("あ2.xml"); DOMSource src = new DOMSource(doc.getDocumentElement()); StreamResult dst = new StreamResult(out); Transformer tfm = TransformerFactory.newInstance().newTransformer(); tfm.transform(src, dst); out.close(); }
[この投稿を含むスレッドを表示] [この投稿を削除]
[188] Re:XMLについて
投稿者:(ぱ)
2007/02/20 02:13:25

>ここで問題なのは、属性を作成するとエラーが発生してしまうということです。 このプログラムを自分のところでコンパイルして動かすほど私は親切ではないので、 エラーが出たというのなら、どんなエラーが出たかぐらいは書いてください。 もちろん、エラーメッセージを直接コピペする形で。 掲示板やMLに質問する際の質問のしかたについては、以下のページが参考になります。 JavaHouse Topics。この中の「質問のしかたについて」 http://java-house.jp/ml/topics/ 技術系メーリングリストで質問するときのパターン・ランゲージ http://www.hyuki.com/writing/techask.html 真 技術系メーリングリストFAQ http://www.geocities.co.jp/SiliconValley/5656/
[この投稿を含むスレッドを表示] [この投稿を削除]
[189] Re:XMLについて
投稿者:kit
2007/02/20 02:13:25

ちょっと気になるのは、神奈川さんがどういう立場で プログラミングをされているかですね。 自力でプログラミングができるようになることが目的で あれば、分からない問題を安易にBBSで聞いて解決する のは考えものです。むしろ、ひとに全く聞かなくても 自分で解けるようになるにはどうすれば良いのかを 考えた方がいいと思います。 最初のうちは、自分で解こうにもどうすればいいのか 見当もつかないことも多いわけですし、神奈川さんの 質問自体、まさにそういう状態にあると思われる質問 なわけですが、こういう場合は、似たようなことを している他人のプログラムを読んで理解し、真似を することから始めるのがいいんじゃないでしょうか。 似たようなプログラムはあるけどどう変えたらいいのか 分からないような場合、それは結局、そのプログラムが どういう動作をしているかちゃんと理解できてないという ことを意味しますから、理解できるようになるまで、 変数の内容表示を行う文を挿入したり、デバッガによる トレースなどを行いながら、他人のプログラムを繰り返し 読むというのが、遠回りに見えて実は近道になると思います。 神奈川さんの質問を見ていると、そもそも他人の書いた プログラムを細部までちゃんと理解して読んだ経験が 少なそうに見える点、そしてもっと大きな問題として、 自分で書くプログラムについても、どう動作するのか、 ちゃんと理解してないように見える点が気になります。 このあたりの問題をきちんと解決しておかないと、当面の 問題は解決できても、いつまでたっても一人だちできない ということになりかねません。 あと、これは基本中の基本なので、わざわざ指摘するのも 何か変な気もするのですが、インデントも変ですよ。 使い捨てのテストプログラムならともかく、人に見て もらう場合、インデントを正しくつけるのは、最低限必要な ことだと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[190] Re:XMLについて
投稿者:kit
2007/02/20 02:13:25

> こういう場合は、似たようなことを > している他人のプログラムを読んで理解し、真似を > することから始めるのがいいんじゃないでしょうか。 書き忘れましたが、読むプログラムは一つではなく、 多いほうが良いです。勉強ってどういう分野でも そうなんですけど、沢山読んでいるうちに、だんだん どうすれば良いのか分かるようになってきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[191] ありがとうございます
投稿者:神奈川
2007/02/20 02:13:25

件名を変更しました。 (ぱ)さん、kit2004さん本当にありがとです。 根本的なところから、やり直す必要が多々あるかもしれません。 プログラムを始めてから、はや2週間ぐらいになります。 ここまで成長(といってもまだまだですが)したのも、ひとえに皆さん のお陰だと思っています。 解らない事もたくさんあり、丁寧に教えてくださったり、サイトを教えてくださったり 本当に感謝しています。 プログラム以外の基本的なこと(ぱ)さんが指摘してくださった。質問のしかたなど も勉強になりました。 こんな基本的なことも知らずに皆さんに接していた事は、失礼な事だと承知しました。 皆さんに聞くにしても、ちゃんとしたルールを守る必要があると強く思いました。 私としては、本や参考書などまず自分で調べてみて、解らなかった事は、人に聞くという プロセスを実行しています。そこで安易に「解らなかったから教えてください」という 感じになっていました。もしかしたら皆さんに不快な思いをさせてしまったかもしれません。 もしそうでしたら、申し訳ないです。 もう一つ自分を成長させるためにも、頑張ってみます。そして本当に解らなかった時、 具体的な説明を踏まえ解らない所を説明をします。 また逆に私が皆さんのお役に立てるように皆さんのお話を継承しこの掲示板を利用していきたいと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[192] Re:ありがとうございます
投稿者:(ぱ)
2007/02/20 02:13:25

本筋と関係ないですが。 >(ぱ)さん、kit2004さん本当にありがとです。 kitさんはkitさんであってkit2004さんではないわけですが、 神奈川さんが「kit2004」さんだと思ってしまったのは、スレッド表示のとき ハンドル名と日付の間に空白が空いてなかったからだと思います。 これは掲示板の仕様の問題で、要するに私が悪いので、先ほど修正しました。 数日前から気になってはいたのですが、対応が遅くなりましてすみません。
[この投稿を含むスレッドを表示] [この投稿を削除]