アーティスト名リストを取得するプログラム

このQ&Aのポイント
  • 指定したディレクトリ下の複数のmp3ファイルからアーティスト名を取り出し、重複しないように表示する
  • 引数に指定されたディレクトリに含まれるmp3ファイルからアーティスト名を抽出し、重複を除いて表示するプログラムの修正方法を教えてください
  • mp3ファイルからアーティスト名を取り出し、同じアーティスト名が重複しないように表示する方法を教えてください
回答を見る
  • ベストアンサー

アーティスト名リストを取得するプログラムなのですが

以下のプログラムは実行すると指定したディレクトリ下の複数のmp3ファイルからアーティスト名を取り出して表示するMainクラスのプログラムです。 例>指定したディレクトリ下にmp3ファイルが三つあり、アーティスト名が花子、次郎、花子で記されていたとすると花子、次郎、花子と表示されます。 この場合だと花子が2回表示されてしまうので同じアーティスト名の場合は重複しないように表示できるようプログラムを変更したいのですが上手く組み込むことができません(>_<) どの箇所を書き加えれば良いか教えてください。 import java.io.File; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.ArrayList; public class MP3FileListMain { /** * @param args * @throws UnsupportedEncodingException */ public static void main(String[] args) throws UnsupportedEncodingException { if(args.length < 1) { System.out.print("引数にディレクトリを指定して\n"); return; } File objFile = new File(args[0]); if(!objFile.isDirectory()) { System.out.print("引数に指定したのは、ディレクトリではない\n"); System.out.print("引数にディレクトリを指定して\n"); return; } FileList objFileList = new FileList(objFile); long lRnt = objFileList.getFileInfo(); // try { MP3Tag.init(); } catch (ClassNotFoundException e) { e.printStackTrace(); } MP3Tag.outputFiles(objFileList); } private static class MP3Tag { private static void init() throws ClassNotFoundException { } private static void outputFiles(FileList objFileList) { MP3File objMP3File; ArrayList objMP3List; // System.out.print(objFileList.getDir() + "\n"); Iterator iteMP3File = objFileList.getMP3FileIte(); while(iteMP3File.hasNext()) { objMP3File = (MP3File)iteMP3File.next(); try { objMP3List = objMP3File.getMP3Info(); } catch (Exception e) { e.printStackTrace(); return; } try { for(int i = 0; objMP3List.size() > i; i++) { MP3Info objMP3Info = (MP3Info)objMP3List.get(i); System.out.print(objMP3Info.getArtist() + ","); } } } catch (Exception e) { e.printStackTrace(); return; } } Iterator iteDir = objFileList.getDirIte(); while(iteDir.hasNext()) { outputFiles((FileList)iteDir.next()); } } } }

noname#149444
noname#149444
  • Java
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • read_man
  • ベストアンサー率63% (14/22)
回答No.3

>実行結果が重複したアーティスト名も表示されてしまいます。 なんだってい じゃあ簡単なサンプル置いとくので自身のソースに組み込んでくださいな ------------------------------ import java.util.ArrayList; import java.util.HashSet; import java.util.List; public class MP3FileListTest { /** * @param args */ public static void main(String[] args) { //MP3Infoの代わり List<String> list = new ArrayList<String>(); list.add("花子"); list.add("次郎"); list.add("花子"); //Case1 普通に表示するパターン for(String l1 : list) { System.out.print(l1 + ","); } System.out.println(); //格納用のハッシュ HashSet<String> hs = new HashSet<String>(); //Case2 ハッシュに格納してから表示するパターン //格納して for(String s2 : list) { hs.add(s2); } //出力 for(String hs2 : hs) { System.out.print(hs2 + ","); } System.out.println(); hs.clear(); //Case3 表示時に重複チェックするパターン for(String l3 :list) { if(!hs.contains(l3)) { System.out.print(l3 + ","); hs.add(l3); } } } } ------------------------------ 実行結果 ------------------------------ 花子,次郎,花子, 次郎,花子, 花子,次郎, ------------------------------ どうせならメインクラス以外の全クラスも記述するか(動くものね)、 該当メソッドだけ抜き出したほうが回答しやすいよ(普通はこっち) 重複する理由だっていろいろあるもの 再帰的にディレクトリ取ってきて上書きしてました、とかね…… ついでにJavaのバージョンとか、エラーでてるならメッセージとかも やり方は沢山あるので、ハッシュにとらわれずなんでも試してみては

noname#149444
質問者

お礼

いろいろとアドバイスをしていただきまして誠にありがとうございます。(^-^) 親切にいくつもの例を挙げて頂いての説明はとても参考になりました。 なんとかがんばってみます。

その他の回答 (2)

  • read_man
  • ベストアンサー率63% (14/22)
回答No.2

ハッシュを使いつつなるべく手を加えないで修正するならこんなカンジ ----------   //ハッシュに格納してから表示するパターン   try {     HashSet<String> hs = new HashSet<String>();     for(int i = 0; objMP3List.size() > i; i++) {       MP3Info objMP3Info = (MP3Info)objMP3List.get(i);       hs.add(objMP3Info.getArtist());     }     for(String out : hs) {       System.out.print(out + ",");     }   } ---------- ただし、ハッシュは順序を保障しないので、3回目の花子addで順番が 入れ替わる → 出力結果:次郎,花子, 動かしてないので予想ですけど…… あるいは、こんな風に使えば → 出力結果:花子,次郎, ----------   //重複チェックしてから表示するパターン   try {     HashSet<String> hs = new HashSet<String>();     for(int i = 0; objMP3List.size() > i; i++) {       MP3Info objMP3Info = (MP3Info)objMP3List.get(i);       String artist = bjMP3Info.getArtist();       if(!hs.contains(artist)) {         System.out.print(artist + ",");         hs.add(artist);       }     }   } ---------- インデント崩れるのやだなー 全角にしてみたけど結局見づらいし……直すの面倒なので置換して ください

noname#149444
質問者

お礼

アドバイスのお礼の言葉が遅れてしまいまして申し訳ございませんでした。 ハッシュを使用した例を二つもあげて頂きまして本当に感謝しております。 2番目の記述を参考にさせて頂いてプログラムを訂正したのですが、実行結果が変わりません、教えてください(>_<)

noname#149444
質問者

補足

重複チェックしてから表示するパターンを参考にしてプログラムを訂正したのですが、実行結果が重複したアーティスト名も表示されてしまいます。 ちなみに訂正したのは例を元にtryの()内とimport java.util.HashSet;を加えました。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

すぐに表示するのではなく、重複をチェックしてから表示すればいのでは? 例えば、 HashSetに全部の名前をadd→最後にまとめて表示とか

noname#149444
質問者

お礼

アドバイスをしていただきましてありがとうごいます。 お礼の言葉が遅れてしまいまして申し訳ございませんでした。

noname#149444
質問者

補足

HashSetは要素の重複を許さない要素の集まりなのはわかりましたが、あまりプログラムとして使い慣れておりませんので、もしよろしければ私のプログラムを用いて教えていただけるとすごく助かります。 どうかよろしくお願いいたします(>_<)

関連するQ&A

  • プログラム実行できません。

    複数のMP3ファイルからタグ情報を取り出すプログラムなのですがMainクラスを実行すると引数にディレクトリを指定してと表示されてしまいます。どの箇所の引数にディレクトリのパスを記述すれば取り出せるのかご教授お願い致します。直、プログラム大きく分けて6つあります。 以下がMainプログラムになります。 **FileList objFileList = new FileList();の括弧の中にディレクトリパスを指定して実行してみましたが引数にディレクトリに指定してと表示されてしまいます。** /** * ID3Tag取得プログラム:MP3FileListMainクラス * Mainクラス **/ import java.io.File; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.ArrayList; public class MP3FileListMain { /** * @param args * @throws UnsupportedEncodingException */ public static void main(String[] args) throws UnsupportedEncodingException { if(args.length < 1) { System.out.print("引数にディレクトリを指定して\n"); return; } File objFile = new File("args[0]"); if(!objFile.isDirectory()) { System.out.print("引数に指定したのは、ディレクトリではない\n"); System.out.print("引数にディレクトリを指定して\n"); return; } FileList objFileList = new FileList(objFile); /*このobjFileの部分にパスを指定したんですけど*/ long lRnt = objFileList.getFileInfo(); // System.out.print(lRnt); try { MP3Tag.init(); } catch (ClassNotFoundException e) { e.printStackTrace(); } MP3Tag.outputFiles(objFileList); } private static class MP3Tag { private static long lSeriesNo_ = 0; private static long lMaxSeriesNo_ = 0; private static long lFileNo_ = 0; private static long lMaxFileNo_ = 0; private static long lTypeNo_ = 0; private static SimpleDateFormat sdf_; private static int handle1_; private static int handle2s_; private static int handle21s_; private static int handle22s_; private static int handle2i_; private static int handle3s_; private static int handle3i_; private static int handle3u_; private static void init() throws ClassNotFoundException { sdf_ = new SimpleDateFormat("yyyyMMddHHmmss"); } private static void outputFiles(FileList objFileList) { int handle = 0; long lSeriesNo = lSeriesNo_; MP3File objMP3File; ArrayList objMP3List; // System.out.print(objFileList.getDir() + "\n"); Iterator iteMP3File = objFileList.getMP3FileIte(); while(iteMP3File.hasNext()) { objMP3File = (MP3File)iteMP3File.next(); try { objMP3List = objMP3File.getMP3Info(); } catch (Exception e) { e.printStackTrace(); return; } try { for(int i = 0; objMP3List.size() > i; i++) { System.out.print(lFileNo_ + ","); System.out.print(lTypeNo_ + ","); System.out.print(lSeriesNo + ","); MP3Info objMP3Info = (MP3Info)objMP3List.get(i); System.out.print(objMP3Info.getLastModified() + ","); System.out.print(objMP3Info.getFileSize() + ","); System.out.print(objMP3Info.getTagVersion() + ","); System.out.print(objMP3Info.getTrackNo() + ","); System.out.print(objMP3Info.getTitle() + ","); System.out.print(objMP3Info.getGenre() + ","); System.out.print(objMP3Info.getArtist() + ","); System.out.print(objMP3Info.getComment() + ","); System.out.print(objMP3Info.getYear() + ","); System.out.print(sdf_.format(new Date()) + ","); System.out.print(objMP3Info.getPath() + ","); System.out.print(objMP3Info.getFileName() + "\n"); } } catch (Exception e) { e.printStackTrace(); return; } lFileNo_++; } Iterator iteDir = objFileList.getDirIte(); while(iteDir.hasNext()) { outputFiles((FileList)iteDir.next()); } } } }

  • ID3タグの情報を取得したいのですが・・・・

    指定したディレクトリ以下にある複数のMP3ファイルからID3タグの情報(アーティスト・作成年・曲名)など表示するプログラムなのですが、実行すると”引数にディレクトリを指定して”と言う表示が返されてしまいます。このプログラムのどの個所にディレクトリを指定する記述をすれば指定したディレクトリ以下のMP3ファイルからID3タグの情報を表示させることができるか教えてください。(>_<) プログラムは大きく分けて      [ID3TagのVer1.0/1.1取得するクラス]       [ID3TagのVer2.3 取得するクラス]      [ID3TagのVer1.0/1.1とVer2.3 取得クラスのスーパークラス]      [指定ディレクトリ以下のファイル一覧を取得するクラス]      [ID3TagのVer1.0/1.1とVer2.3 取得クラスを取得・保持するクラス]      [ID3Tag取得プログラムするMainクラス]                                             から構成されています。 <以下に示すのがMainクラスのプログラムです。> import java.io.File; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.ArrayList; public class MP3FileListMain { /** * @param args * @throws UnsupportedEncodingException */ public static void main(String[] args) throws UnsupportedEncodingException { if(args.length < 1) { System.out.print("引数にディレクトリを指定して\n"); return; } File objFile = new File(args[0]); if(!objFile.isDirectory()) { System.out.print("引数に指定したのは、ディレクトリではない\n"); System.out.print("引数にディレクトリを指定して\n"); return; } FileList objFileList = new FileList(objFile); long lRnt = objFileList.getFileInfo(); // System.out.print(lRnt); try { MP3Tag.init(); } catch (ClassNotFoundException e) { e.printStackTrace(); } MP3Tag.outputFiles(objFileList); } private static class MP3Tag { private static long lSeriesNo_ = 0; private static long lMaxSeriesNo_ = 0; private static long lFileNo_ = 0; private static long lMaxFileNo_ = 0; private static long lTypeNo_ = 0; private static SimpleDateFormat sdf_; private static int handle1_; private static int handle2s_; private static int handle21s_; private static int handle22s_; private static int handle2i_; private static int handle3s_; private static int handle3i_; private static int handle3u_; private static void init() throws ClassNotFoundException { sdf_ = new SimpleDateFormat("yyyyMMddHHmmss"); } private static void outputFiles(FileList objFileList) { int handle = 0; long lSeriesNo = lSeriesNo_; MP3File objMP3File; ArrayList objMP3List; // System.out.print(objFileList.getDir() + "\n"); Iterator iteMP3File = objFileList.getMP3FileIte(); while(iteMP3File.hasNext()) { objMP3File = (MP3File)iteMP3File.next(); try { objMP3List = objMP3File.getMP3Info(); } catch (Exception e) { e.printStackTrace(); return; } try { for(int i = 0; objMP3List.size() > i; i++) { System.out.print(lFileNo_ + ","); System.out.print(lTypeNo_ + ","); System.out.print(lSeriesNo + ","); MP3Info objMP3Info = (MP3Info)objMP3List.get(i); System.out.print(objMP3Info.getLastModified() + ","); System.out.print(objMP3Info.getFileSize() + ","); System.out.print(objMP3Info.getTagVersion() + ","); System.out.print(objMP3Info.getTrackNo() + ","); System.out.print(objMP3Info.getTitle() + ","); System.out.print(objMP3Info.getGenre() + ","); System.out.print(objMP3Info.getArtist() + ","); System.out.print(objMP3Info.getComment() + ","); System.out.print(objMP3Info.getYear() + ","); System.out.print(sdf_.format(new Date()) + ","); System.out.print(objMP3Info.getPath() + ","); System.out.print(objMP3Info.getFileName() + "\n"); } } catch (Exception e) { e.printStackTrace(); return; } lFileNo_++; } Iterator iteDir = objFileList.getDirIte(); while(iteDir.hasNext()) { outputFiles((FileList)iteDir.next()); } } } }

    • ベストアンサー
    • Java
  • プログラムを実行させたいのですが・・・・・

    複数のMP3ファイルからタグ情報を取り出すプログラムなのですがMainクラスを実行すると引数にディレクトリを指定してと表示されてしまいます。どの箇所の引数にディレクトリのパスを記述すれば取り出せるのかご教授お願い致します。直、プログラム大きく分けて6つあります。      <ID3V1Infoクラス>      <ID3V2Infoクラス>      <MP3FileクラスID3TagのVer1.0/1.1とVer2.3 取得クラスを取得・保持するクラス>      <MP3InfoクラスID3TagのVer1.0/1.1とVer2.3 取得クラスのスーパークラス>      <MP3FileListMainクラスMainクラス>       <FileListクラス指定ディレクトリ以下のファイル一覧を取得するクラス>のプログラムは以下のようになります。 /** * ID3Tag取得プログラム:FileListクラス * 指定ディレクトリ以下のファイル一覧を取得するクラス */ import java.io.File; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Iterator; public class FileList { private ArrayList objMp3FileList = null; private ArrayList objDirList = null; private File objFile_; public FileList(File objFile) { objFile_ = objFile; } public long getFileInfo() throws UnsupportedEncodingException { if(objFile_ == null) { System.out.print("Argment is null.\n"); return -1; // error } String strCurrentPath = objFile_.toString(); if(!objFile_.isDirectory()) { System.out.print("This Path is not Directry. :" + strCurrentPath + "\n"); return -1; } objMp3FileList = new ArrayList(); objDirList = new ArrayList(); for(int i = 0; objFile_.listFiles().length > i; i++) { if(objFile_.listFiles()[i].isDirectory()) { FileList objFileList = new FileList(objFile_.listFiles()[i]); objFileList.getFileInfo(); objDirList.add(objFileList); } else if(objFile_.listFiles()[i].isFile()) { MP3File objMP3File = new MP3File(objFile_.listFiles()[i]); objMP3File.getMP3Info(); objMp3FileList.add(objMP3File); } } return 0; } public Iterator getMP3FileIte() { return objMp3FileList.iterator(); } public Iterator getDirIte() { return objDirList.iterator(); } public String getDir() { return objFile_.getPath(); } }

    • ベストアンサー
    • Java
  • コンストラクタにパスを記述する方法を教えて下さい

    以下に示したプログラムのコンストラクタの引数の部分(File objFile)にディレクトリパスである C:\Users\NEC-PCuser\ArtNameを記述したいのですがエラーになってしまいます。どのように記述すれば引数にディレクトリパスを指定することができるかご教授お願いいたします。 以下がプログラムになります。 /** * ID3Tag取得プログラム:FileListクラス * 指定ディレクトリ以下のファイル一覧を取得するクラス */ import java.io.File; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Iterator; public class FileList { private ArrayList objMp3FileList = null; private ArrayList objDirList = null; private File objFile_; public FileList(File objFile) { /*public FileList("C:\\Users\\NEC-PCuser\\ArtName") */ objFile_ = objFile; /*↑↑のように記述するとエラーになります。↑↑*/ } public long getFileInfo() throws UnsupportedEncodingException { if(objFile_ == null) { System.out.print("Argment is null.\n"); return -1; // error } String strCurrentPath = objFile_.toString(); if(!objFile_.isDirectory()) { System.out.print("This Path is not Directry. :" + strCurrentPath + "\n"); return -1; } objMp3FileList = new ArrayList(); objDirList = new ArrayList(); for(int i = 0; objFile_.listFiles().length > i; i++) { if(objFile_.listFiles()[i].isDirectory()) { FileList objFileList = new FileList(objFile_.listFiles()[i]); objFileList.getFileInfo(); objDirList.add(objFileList); } else if(objFile_.listFiles()[i].isFile()) { MP3File objMP3File = new MP3File(objFile_.listFiles()[i]); objMP3File.getMP3Info(); objMp3FileList.add(objMP3File); } } return 0; } public Iterator getMP3FileIte() { return objMp3FileList.iterator(); } public Iterator getDirIte() { return objDirList.iterator(); } public String getDir() { return objFile_.getPath(); } }

    • ベストアンサー
    • Java
  • Processing :指定フォルダ内のフォルダ名とファイル名の取得

    Javaと同じかな~と思って、以下のスプリクトを試してみたのですが、だめでした。 すみません、ヒントください。 環境:OS X import java.io.*; public class Test { public static Hoge() { try { File directory1 = new File("User/***/Desktop); String[] fileArray = directory1.list(); for(int i = 0; i < fileArray.length; i++) { System.out.println(fileArray[i]); } } catch (IOException e) { } } }

    • ベストアンサー
    • Java
  • RGB値の取得について(java)

    お世話になります。 Javaプログラム上で、指定した画像のRBG値を取得するプログラムを作りましたが、得られた値が思わしくありません。最終的にグレースケール化するためにRGB値を取得したいと考えています。 例えば、原画像の左上の画素のRGB値をgimpで確認すると、それぞれ200前後の値が、プログラムで返された値は50前後になってしまいます。 以下にソースを貼ります。とりあえず、100個の画素のRGB値を取得するように設定しています。まだjavaを勉強し始めて日が浅く、低レベルの質問かもしれませんが、解決策を教えていただける方、よろしくお願いいたします。 import java.io.*; import java.lang.*; import java.awt.*; import java.awt.color.ColorSpace; import java.awt.event.*; import javax.swing.*; import javax.imageio.ImageIO; import javax.media.*; import javax.media.control.*; import javax.media.format.*; import javax.media.util.*; import java.awt.image.*; import java.applet.*; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import java.io.File; import java.io.IOException; import java.util.*; import java.text.*; public class Sample{ static BufferedImage image; public static void main(String[] args){ try { //画像ファイルのデータを読み込む image = ImageIO.read(new File("C:\\QR\\imagefile\\sa.bmp")); } catch (Exception e) { e.printStackTrace(); image = null; } int i,j; int width = image.getWidth(); int height = image.getHeight(); int gray[][] = new int[width][height]; for(i = 0;i < 1 ;i++){ for(j = 0;j < 100 ;j++){ int rgb = image.getRGB(j,i); rgb = 0-rgb; int b = rgb%256; System.out.print(" "+b); int g = (rgb/256)%256; System.out.print(" "+g); int r = rgb/256/256; System.out.print(" "+r); gray[j][i] = (int)((0.299*r + 0.587*g + 0.114*b)); } System.out.println(""); } } }

    • ベストアンサー
    • Java
  • for文について【ID3タグ取得のプログラム】

    ID3タグ取得のプログラムなのですがちゃんと動いたのは良いんですが解らないプログラム部分がありました。 ググったり過去の質問探したりしたのですが解答が見つかりません。 お手数ではありますがご教授願います。 以下はプログラムです。 /*ID3タグ取得プログラム*/ import java.io.*; import java.nio.channels.*; import java.util.Arrays; class TagInfo{ final private String name; final private int pos; final private int len; public TagInfo(String name,int pos,int len){ this.name=name; this.pos=pos; this.len=len; } public String getName() { return name; } public int getPos() { return pos; } public int getLen() { return len; } } public class M_data { private static byte[] copyOfRange(byte b[],int pos, int len){ byte[] a=new byte[len]; System.arraycopy(b,pos,a,0,len); return a; // return java.util.Arrays.copyOfRange(b,pos,pos+len); } static void music() throws IOException{ File file = new File("C:/music/music4.mp3"); FileInputStream fis=new FileInputStream(file); String charsetName="Shift_JIS"; //if(1<args.length) charsetName=args[1]; FileChannel fc=fis.getChannel(); fc.position(fc.size()-128); byte[] b=new byte[128]; if(fis.read(b)==128 && b[0]=='T' && b[1]=='A' && b[2]=='G'){ TagInfo[] infos={new TagInfo("Song title:",3,30),new TagInfo("Artist:",33,30), new TagInfo("Album:",63,30),new TagInfo("Year:",93,4), new TagInfo("Comment:",97,30),new TagInfo("Genre:",127,1) }; int i=0; /*以下のfor文です*/ for(TagInfo info: infos){ System.out.print(i + info.getName()); System.out.println(new String(copyOfRange(b,info.getPos(),info.getLen()),charsetName)); i++; } } } public static void main(String[] args) throws IOException{ music(); } }

    • ベストアンサー
    • Java
  • JAVAのソートプログラムについて

    List1.txtの内容の単語の数を数え、その数を単語の隣に表示するプログラムを作りました。 (1)List1.txtの内容 ゲーム ゲーム 麻雀 麻雀 野球 ゲーム (2)実行結果 C:\>java Lists ゲーム 3 野球 1 麻雀 2 (3)プログラム import java.io.BufferedWriter; import java.nio.charset.Charset; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; import java.util.TreeMap; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import java.util.*; public class Lists { public static void main(String[] args) throws IOException{ File file3 = new File("C:\\List1.txt"); BufferedReader br3 = new BufferedReader(new FileReader(file3)); FileWriter filewriter3 = new FileWriter(file3,true); TreeMap<String,Integer> tm = new TreeMap<String,Integer>(); String line; while((line = br3.readLine()) != null){ String[] words = line.split("\\s"); for(String s : words){ if(!tm.containsKey(s)){ tm.put(s,1); }else{ tm.put(s,tm.get(s).intValue()+1); }} } for(String s : tm.keySet()){ System.out.println(s + " " + tm.get(s) ); }}} このプログラムを上から単語の数が多い順に表示したいのですがどこをどう修正したらいいのか悩んでます。 C:\>java Lists ゲーム 3 麻雀 2 野球 1 と表示されればOKです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaのソートプログラムについて

    List1.txtの内容の単語の数を数え、その数を単語の隣に表示するプログラムを作りました。 (1)List1.txtの内容 ゲーム ゲーム 麻雀 麻雀 野球 ゲーム (2)実行結果 C:\>java Lists ゲーム 3 野球 1 麻雀 2 (3)プログラム import java.io.BufferedWriter; import java.nio.charset.Charset; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; import java.util.TreeMap; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import java.util.*; public class Lists { public static void main(String[] args) throws IOException{ File file3 = new File("C:\\List1.txt"); BufferedReader br3 = new BufferedReader(new FileReader(file3)); FileWriter filewriter3 = new FileWriter(file3,true); TreeMap<String,Integer> tm = new TreeMap<String,Integer>(); String line; while((line = br3.readLine()) != null){ String[] words = line.split("\\s"); for(String s : words){ if(!tm.containsKey(s)){ tm.put(s,1); }else{ tm.put(s,tm.get(s).intValue()+1); }} } for(String s : tm.keySet()){ System.out.println(s + " " + tm.get(s) ); }}} このプログラムを上から単語の数が多い順に表示したいのですがどこをどう修正したらいいのか悩んでます。 C:\>java Lists ゲーム 3 麻雀 2 野球 1 と表示されればOKです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • プログラムからメソッドを呼び出したいのですが

    今、ArtName.javaのプログラムにM_data.javaのプログラム内のメッソドを呼び出したいのですがコンパイルするとエラーになってしまいます。どのように記述すればメッソドを呼び出すことができるかご教授お願いたします。 以下がプログラムになります。 /*ArtName.java*/ import java.io.*; import java.nio.channels.*; import java.util.Arrays; class ArtName{ public static void an(String[] arg){ int i,j,number,song; char artname[]=new char[song]; M_data.music(); number=1; for(i=0;i<song;i++){ for(j=0;j<song;j++){ if(TagInfo[i]!=TagInfo[j]){ number++; } } } } } /*M_data.java*/ import java.io.*; import java.nio.channels.*; import java.util.Arrays; class TagInfo{ final private String name; final private int pos; final private int len; public TagInfo(String name,int pos,int len){ this.name=name; this.pos=pos; this.len=len; } public String getName() { return name; } public int getPos() { return pos; } public int getLen() { return len; } } public class M_data { private static byte[] copyOfRange(byte b[],int pos, int len){ byte[] a=new byte[len]; System.arraycopy(b,pos,a,0,len); return a; // return java.util.Arrays.copyOfRange(b,pos,pos+len); } static void music() { File file = new File("C:/Users/NEC-PCuser/Downloads/ Answer .mp3"); FileInputStream fis=new FileInputStream(file); String charsetName="Shift_JIS"; //if(1<args.length) charsetName=args[1]; FileChannel fc=fis.getChannel(); fc.position(fc.size()-128); byte[] b=new byte[128]; if(fis.read(b)==128 && b[0]=='T' && b[1]=='A' && b[2]=='G'){ TagInfo[] infos={new TagInfo("Song title:",3,30),new TagInfo ("Artist:",33,30)}; int i=0; /*以下のfor文です*/ for(TagInfo info: infos){ System.out.print(i + info.getName()); System.out.println(new String(copyOfRange(b,info.getPos (),info.getLen()),charsetName)); i++; } } } public static void main(String[] args) throws IOException{ music(); } } ArtName.javaをコンパイルすると Artname.java:17シンボルが見つかりません。 シンボル:ArtNameのクラス        if(TagInfo[i]!=TagInfo[j]{ とエラーになります。どのように記述すればコンパイルできるかお教えてください。 よろしくお願いいたします。

専門家に質問してみよう