![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
以下のプログラムは実行すると指定したディレクトリ下の複数の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());
}
}
}
}
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のバージョンとか、エラーでてるならメッセージとかも
やり方は沢山あるので、ハッシュにとらわれずなんでも試してみては
いろいろとアドバイスをしていただきまして誠にありがとうございます。(^-^)
親切にいくつもの例を挙げて頂いての説明はとても参考になりました。
なんとかがんばってみます。
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);
}
}
}
----------
インデント崩れるのやだなー
全角にしてみたけど結局見づらいし……直すの面倒なので置換して
ください
この回答への補足
重複チェックしてから表示するパターンを参考にしてプログラムを訂正したのですが、実行結果が重複したアーティスト名も表示されてしまいます。
ちなみに訂正したのは例を元にtryの()内とimport java.util.HashSet;を加えました。
アドバイスのお礼の言葉が遅れてしまいまして申し訳ございませんでした。
ハッシュを使用した例を二つもあげて頂きまして本当に感謝しております。
2番目の記述を参考にさせて頂いてプログラムを訂正したのですが、実行結果が変わりません、教えてください(>_<)
No.1
- 回答日時:
すぐに表示するのではなく、重複をチェックしてから表示すればいのでは?
例えば、 HashSetに全部の名前をadd→最後にまとめて表示とか
この回答への補足
HashSetは要素の重複を許さない要素の集まりなのはわかりましたが、あまりプログラムとして使い慣れておりませんので、もしよろしければ私のプログラムを用いて教えていただけるとすごく助かります。
どうかよろしくお願いいたします(>_<)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Ruby 教えてください 2 2023/01/04 17:50
- その他(プログラミング・Web制作) python flask から fastapiへの移行時のエラー対処 1 2023/02/05 12:26
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- その他(プログラミング・Web制作) python 2 2022/12/23 09:06
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
importするには java.io.*; imp...
-
ActionForm form にnullが入っ...
-
Selenium IDEでexportしたコー...
-
JavaMailについて
-
Javaで常駐するソフトを作って...
-
<forEach> 内で供給された "ite...
-
干支の計算で。。。
-
importとextendsの用い方の違い...
-
JButtonの改行したラベルがリロ...
-
setAttribute(String, int)は適...
-
【JAVAエラー】互換性のない型...
-
シャットダウンフックが呼ばれない
-
(疑問+急募)Javaでフレーム入り...
-
「例外 *** は対応する try 文...
-
ループ処理の際、最後だけ","を...
-
C言語のポインターに関する警告
-
VBAで配列の計算
-
ダブルクォーテーションのrepla...
-
JSPやサーブレットでSystem.out...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
<forEach> 内で供給された "ite...
-
「例外 *** は対応する try 文...
-
importするには java.io.*; imp...
-
Javaを使ってデジタル時計を作...
-
setAttribute(String, int)は適...
-
シャットダウンフックが呼ばれない
-
干支の計算で。。。
-
Selenium IDEでexportしたコー...
-
ColabでのPytorchのエラー
-
【JAVAエラー】互換性のない型...
-
文字列を数式に
-
importとextendsの用い方の違い...
-
Java3Dで横置き円筒体の円筒中...
-
HttpClientについて
-
ActionForm form にnullが入っ...
-
java初心者です。座標取得と図...
-
javaで画像を回転縮小
-
(急募)Javaじゃんけんゲームで
-
画面遷移時のデータ遷移について
おすすめ情報