• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Javaのカウント方法について)

Javaのカウント方法について

このQ&Aのポイント
  • Javaのカウント方法について続きで伺います。仮に集計できても、郵便番号が区ごとに分かれてしまい、正しい集計結果を得るための方向性について質問させてください。
  • Javaのカウント方法で郵便番号を集計する際に、区ごとに集計結果を得るためには、文字列の配列を設定し、集計結果をソートする必要があります。クエリで集計する場合とは異なるアプローチが必要です。
  • Javaのカウント方法について質問させていただきます。具体的には、郵便番号が区ごとに分かれてしまい、正しい集計結果を得るためにはどのような方針が必要なのかを教えていただきたいです。

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

  • ベストアンサー
  • hofchan
  • ベストアンサー率62% (17/27)
回答No.1

続きみたいですが、前回を知らないので はずしているかも知れませんが 26KYOUTO.CSV の一行が 26101 の場所を カウントするコードでいいのならこれで どうでしょう、出来る限りあなたのコードは 崩していません import java.io.*; public class Counter {  public static void main(String args[]) {   String file = "26KYOUTO.CSV";   String line = null;   int count = 0;    if (args.length > 0) file = args[0];    try {     BufferedReader br =      new BufferedReader(new FileReader(file));     while ((line = br.readLine()) != null) {      if (line.equals("26101")) count++;     }     br.close();    } catch (Exception e) {    } finally {    }    System.out.println(count);   } }

ta1999
質問者

お礼

hofchan様 返信遅くなりました。 一応完成いたしましたので、ご報告致します。 26KYOUTO.CSVファイルの一行目の不要なファイルをカウントしないようにしなければなりませんが、このように完成しました。 今まで有難う御座いました。 import java.io.FileReader; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.*; import java.util.StringTokenizer; public class Csv_0809{ static String fname = "26KYOUTO.CSV"; public static void main(String[] args) { if(args.length>0)fname = args[0]; try{ BufferedReader reader = new BufferedReader(new FileReader(fname)); String line = reader.readLine(); String globalNumber = ""; int count = 1; String address = ""; int rowcount = 0; while(line != null) { StringTokenizer st = new StringTokenizer(line,","); String number = st.nextToken(); if(number.equals(globalNumber)) { count++; for(int i = 0; i < 7; i++){ address=st.nextToken(); } } else { if(rowcount != 0){ System.out.println(address + count); } count = 1; globalNumber = number; } line = reader.readLine(); rowcount++; } reader.close(); }catch(FileNotFoundException e) { System.out.println("ファイルがありません。"); }catch(IOException e){ System.out.println("入出力エラーです。"); } } }

ta1999
質問者

補足

hofchan様 アドバイス有難う御座います。 実は26KYOUTO.CSVとは郵便局のHPからダウンロードした郵便番号のファイルなんですが、結果を郵便番号が26101=24(件)、26102=2*(件)ではなく、北区=24(件)、下京区=2*件という形に設定できればとおもっているのですができずに四苦八苦しています。 集計し、結果を仕分けることは難しいことを実感しています。 今後も「Javaのカウント方法について」というタイトルで完成するまで記載するので、何かしら気づいた点がありましたら何卒よろしく御願い致します。

その他の回答 (6)

  • hofchan
  • ベストアンサー率62% (17/27)
回答No.7

まず、26KYOUTO.csv を見て最初に書いたコードは 「次は東京都と北海道も集計してくれ」と言われた時に Counter インターフェイスを実装した TokyoCounter と HokkaiCounter を書けば事が足りるコードでした ですが、それだとコードが少しだけ今より複雑になり 本来の質問の「京都府の区を集計する」事に対して ta1999 さんが必要かどうかもわからない拡張を加え 逆にわかりにくくさせるのもどうかと考えて 簡略化したコードが #5 のコードです、本来は 出来る限りそんな風に書くのがいいと思います # 実際それが必要になればデータベースかな? それに対して #6 のコードは、一度京都の集計結果を 出して、それを別なファイルに保存してしまえば そのプログラムはその集計結果のファイルがある限りは もう使うことはありません、この理由で「使い捨てのコード」です それをわざわざ Java で書くよりも、簡単に書ける Perl で書いた方が楽かな、という意味です

ta1999
質問者

お礼

hofchan様 返信、アドバイス有難う御座いました。 また、お礼のメールが遅くなり申し訳ありません。 『Java で書くよりも、簡単に書けるPerl で・・・・』ということだったんですね。ぱっと見た感じではPerlが簡単かわかりませんでしたが、 Perlにしろ、いずれ全てのプログラミング言語を作成してみようと考えています。その意味でさまざまな言語の経験がある方の意見は自分には大変貴重です。有難う御座います。 急いでいるとはいえ、今だデバック状態や、一部の苦手な文法の活用方法を見直している状態で、その後の経過をこのサイトに報告できず、申し訳ありません。 宜しくお願い致します。

  • hofchan
  • ベストアンサー率62% (17/27)
回答No.6

文字数の関係上わけます #5 です   String[] index = {"\"京都市北区\"",            "\"京都市上京区\"",            "\"京都市左京区\"",            "\"京都市中京区\"",            "\"京都市東山区\"",            "\"京都市下京区\"",            "\"京都市南区\"",            "\"京都市右京区\"",            "\"京都市伏見区\"",            "\"京都市山科区\"",            "\"京都市西京区\""}; の部分を他の都道府県の区に書き換えて 別な都道府県のファイルを読み込ませても動く事を考えて 書きましたが、一部訂正です Analysis クラスの   Counter[] count = new Counter[11]; は   Counter[] count = new Counter[index.length]; とするべきですね、完全に使い捨てでよければ ------------------------------------------------- package analysis; import java.io.*; import java.util.regex.*; public class Analysis {  public static void main(String args[]) {   String line = null;   int counter = 0;      int kitaku = 0;   int kamigyouku = 0; // ここにそれぞれの区のカウンターを並べる(略)   int saikyouku = 0;   try {    BufferedReader br =     new BufferedReader(new FileReader("26KYOUTO.csv"));    while (br.ready()) {     String[] props = br.readLine().split(",");     if (props[0].equals("26101")) kitaku++;     else if (props[0].equals("26102")) kamigyouku++; // ここにも同じ様に並べる(略)     else if (props[0].equals("26111")) saikyouku++;     counter++;    }    } catch (Exception e) {    } finally {    }   System.out.println("北区\t:\t" + kitaku);   System.out.println("上京区\t:\t" + kamigyouku); // ここにも並べる(略)   System.out.println("西京区\t:\t" + saikyouku);   System.out.println("------------------------");   System.out.println("+\t\t" + counter);  } } -------------------------------------------------- でもいいでしょうが、こちらは本当に使い捨てです perl なんかで書いて 1 ~ 2 回使って捨てるコードです 思ったより使用頻度が多ければ Java や C/C++ で書き直すといった ところでしょうか、頑張ってください

ta1999
質問者

お礼

hofchan様 No.5、6のご返信、アドバイス有難う御座いました。 また、お礼のメールが遅くなり申し訳ありません。 大変助かります! 現在内容を理解しながら、デバックを行っております。 それと「本当に使い捨てです」というのは?(ちなみにperlの経験はありません。) 素人的な質問で申し訳ありませんが、お時間があるときにご返信お願い致します。 宜しくお願い致します。

  • hofchan
  • ベストアンサー率62% (17/27)
回答No.5

------------------------------------------ // interface 無くてもいい package analysis; interface Counter {  String getIndex();  void setIndex(String index);  void setCount();  int getCount(); } ------------------------------------------- // カウントをとるクラス package analysis; public class KyoutoCounter implements Counter {  private int counter;  private String index;  public KyoutoCounter(String index) {   this.index = index;  }  public String getIndex() {   return index;  }  public void setIndex(String index) {   this.index = index;  }  public void setCount() {   counter++;  }  public int getCount() {   return counter;  } } ------------------------------------------------------ package analysis; import java.io.FileReader; import java.io.BufferedReader; import java.io.IOException; public class Analysis {  public static void main(String args[]) {   String[] index = {"\"京都市北区\"",            "\"京都市上京区\"",            "\"京都市左京区\"",            "\"京都市中京区\"",            "\"京都市東山区\"",            "\"京都市下京区\"",            "\"京都市南区\"",            "\"京都市右京区\"",            "\"京都市伏見区\"",            "\"京都市山科区\"",            "\"京都市西京区\""};   String line = null;   String file = "26KYOUTO.csv";   int counter = 0;   if (args.length > 0) file = args[0];   Counter[] count = new Counter[11];   for (int i = 0; i < index.length ; i++) {    count[i] = new KyoutoCounter(index[i]);   }   try {    BufferedReader br;     br = new BufferedReader(new FileReader(file));    while (br.ready()) {     String[] props = br.readLine().split(",");     for (int i = 0; i < index.length ; i++) {      if (props[7].equals(count[i].getIndex()))       count[i].setCount();     }     counter++;    }   } catch (Exception e) {   } finally {   }   for (int i = 0; i < index.length; i++) {    System.out.println(count[i].getIndex()          + "\t:\t" + count[i].getCount());   }   System.out.println("---------------------------");   System.out.println("+\t\t" + counter);  } } ---------------------------------------------- 実行結果 ---------------------------------------------- "京都市北区" : 360 "京都市上京区" : 660 "京都市左京区" : 506 "京都市中京区" : 556 "京都市東山区" : 214 "京都市下京区" : 601 "京都市南区" : 266 "京都市右京区" : 556 "京都市伏見区" : 628 "京都市山科区" : 290 "京都市西京区" : 255 --------------------------- + 6657 少し無理矢理な感じします このあたりは、本当は Perl なんかで 使い捨てにするコードです、長く使う必要が あればデータベースがいいですね

  • hofchan
  • ベストアンサー率62% (17/27)
回答No.4

26KYOUTO.CSV というファイルを 郵便局の HP から DL されたということは 一般公開されているファイルですよね? 差し支え無ければ 2 ~ 3 行書き出す、または その DL ページへのリンクがあれば回答が 付けやすいです 最終確認として >そのCSVには各市町村の町名までの郵便番号総一覧がありますので >それを市町村別に集計し、結果を表示したいと考えています これは 北区=***** の形ということですから、市町村にまで分ける というより、それぞれの「区」の集計を表示させるということですよね? つまりは標準出力で --------------------------------- 北区 = 24 下京区 = *** --------------------------------- とするだけでしょうか? だとすれば CSV を見れば普通に出来ると思いますよ

ta1999
質問者

補足

hofchan様 早速のご返信、アドバイス有難う御座います。 DL ページへのリンクは http://www.post.japanpost.jp/zipcode/dl/oogaki.html からダウンロードしました。 --------------------------------- 北区 = 24 下京区 = *** --------------------------------- 仰るとおり以上の形で表示させたいです。 ただ、自分ではQNo.3225750で公開した方法でしか今だわかりません。例えば北区だけの集計はできても、それぞれの「区」の集計という表示までは中々おもいつきません。後は配列やソートを行わなければ表示は難しいと考えていますが・・・ まだまだ初心者レベルでご教授頂ければと思います。 何か補足点あれば何なりと仰ってくださればと存じます。 よろしく御願い致します。

  • hofchan
  • ベストアンサー率62% (17/27)
回答No.3

やろうとされている事がなんとなく分かったような 気もしますが、疑問もあります まず、その .csv は " , " で区切られたあの CSV です よね? だとすれば、そのファイルをどの様に解析したいのでしょうか? 北区= **** にしたいという事は 京都府の中から京都市に分けて、さらに解析するのでしょうか? これをデータベース無しでやると言うことですよね CSV を見てそれをどんな仕様にしたいのか 例えば (北区と入力すれば 北区= の形になる) (ただ標準出力で 北区= 下京区= の形にする) 等が分からなければなければ何とも言えませんが >if(line.equals("26101")){//配列を設定? これは配列では無く String line が 26101 と等価であれば true をかえします >System.out.println("京都府北区=" +count ); これは標準出力で 京都府北区=******* // ****** はカウント数です つまりは、ファイルに 26101 と書かれた行は何行あるのかを 調べているだけです # CSV だとおかしい気もします .....

ta1999
質問者

補足

hofchan様 早速のご返信、アドバイス有難う御座います。 .csv は " , " で区切られたあの CSV です よね? →はい、郵便局のHPからダウンロードしたカンマ区切りのファイルです。 だとすれば、そのファイルをどの様に解析したいのでしょうか? 京都府の中から京都市に分けて、さらに解析するのでしょうか? →はい、そのCSVには各市町村の町名までの郵便番号総一覧がありますので、それを市町村別に集計し、結果を表示したいと考えています。 京都府の中から京都市に分けて、さらに解析するのでしょうか? これをデータベース無しでやると言うことですよね CSV を見てそれをどんな仕様にしたいのか? →はい、京都市の各市町村にわけます。できればDBなしでCSVの中で 北区=**という形で抽出したいと考えています。 ただ今のロジックでは全市町村別に集計し、さらに結果を表示するのは難しく色々ご質問した限りです。 ロジックを再度思考中ですが、また何かしらのご鞭撻いただければと存じます。 宣しく御願い致します。

  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.2

どうも、neko_nokoです。 ご指名いただいたので、回答します。 >当然郵便番号が26101=24(件)、26102=2*(件)となってしまい、 >北区=24(件)、下京区=2*件という形にしたければ DBを使わないとすれば、Hashtableなどを使ってみてはどうでしょうか? キーを郵便番号、値を住所にすれば値の取得もやりやすいと思います。

ta1999
質問者

お礼

neko_noko様 早速のご返信、アドバイス有難う御座いました。 「Hashtable」はあまり使ったことがありませんが、作ってみようと思います。 いずれ時間が取れ次第、DBを使った方法でも作成しようと思います。 また、完成するまで今後の詳細は載せようと思います。 お時間があるときに見て頂ければ幸いです。 有難う御座いました。

関連するQ&A