電子書籍の厳選無料作品が豊富!

以下のプログラムは実行すると指定したディレクトリ下の複数の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());
}
}
}
}

A 回答 (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のバージョンとか、エラーでてるならメッセージとかも

やり方は沢山あるので、ハッシュにとらわれずなんでも試してみては
    • good
    • 0
この回答へのお礼

いろいろとアドバイスをしていただきまして誠にありがとうございます。(^-^)

親切にいくつもの例を挙げて頂いての説明はとても参考になりました。

なんとかがんばってみます。

お礼日時:2012/02/24 23:19

ハッシュを使いつつなるべく手を加えないで修正するならこんなカンジ


----------
  //ハッシュに格納してから表示するパターン
  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);
      }
    }
  }
----------

インデント崩れるのやだなー
全角にしてみたけど結局見づらいし……直すの面倒なので置換して
ください

この回答への補足

重複チェックしてから表示するパターンを参考にしてプログラムを訂正したのですが、実行結果が重複したアーティスト名も表示されてしまいます。

ちなみに訂正したのは例を元にtryの()内とimport java.util.HashSet;を加えました。

補足日時:2012/02/24 15:02
    • good
    • 0
この回答へのお礼

アドバイスのお礼の言葉が遅れてしまいまして申し訳ございませんでした。

ハッシュを使用した例を二つもあげて頂きまして本当に感謝しております。

2番目の記述を参考にさせて頂いてプログラムを訂正したのですが、実行結果が変わりません、教えてください(>_<)

お礼日時:2012/02/24 15:02

すぐに表示するのではなく、重複をチェックしてから表示すればいのでは?


例えば、 HashSetに全部の名前をadd→最後にまとめて表示とか

この回答への補足

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

どうかよろしくお願いいたします(>_<)

補足日時:2012/02/23 01:30
    • good
    • 0
この回答へのお礼

アドバイスをしていただきましてありがとうごいます。

お礼の言葉が遅れてしまいまして申し訳ございませんでした。

お礼日時:2012/02/23 01:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!