我是java的新手,希望对以下内容提出一些建议
我有两个文件:
SongsList.java和SongsMenu.java
SongsMenu.java(http://pastie.org/private/cm0zpembkqnfjif0pgdadq)第38/39行
import java.util.Scanner;
import java.util.InputMismatchException;
public class SongsMenu {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
...
switch (listMenuItem) {
case 1:
System.out.println("Album");
SongsList sl = new SongsList();
System.out.println(sl);
break;
和SongsList.java(http://pastie.org/private/qljonhfdronvbq4ahcqgmq)
public class SongsList {
public static void main(String args[]) throws Exception {
// reads the file and returns a list of my Music.txt file
...
当我运行SongsList时,我得到:
$java SongsList
Track 58 Reggae 1637918 81 58 59 18/02/2010 21:02 28/01/2012 14:07 160 44100 MPEG audio file khinester:Users:khinester:Music:iTunes:iTunes Music:Unknown Artist:Unknown Album:58 Track 58.mp3
Track 59 Reggae 4239191 211 59 59 18/02/2010 21:02 28/01/2012 14:07 160 44100 MPEG audio file khinester:Users:khinester:Music:iTunes:iTunes Music:Unknown Artist:Unknown Album:59 Track 59.mp3
...
但是当我运行SongsMenu时
$java SongsMenu
1) Album
...
1
Album
SongsList@50ef5502
如何返回列表,而不是'SongsList @ 50ef5502'我希望最终能够按照专辑,姓名和搜索的顺序列出。
任何建议都非常感谢。
答案 0 :(得分:1)
如果要在整个对象上使用println,则需要在该对象中实现toString()方法。 所以,如果你想这样做:
SongsList sl = new SongsList();
System.out.println(sl);
类SongsList需要覆盖toString方法:
public class SongsList {
public String toString(){
String str;
//build a string using input from your textfile
return str;
}
否则它只会打印对象不是你想要的对象
答案 1 :(得分:1)
问题在于这一行
::line number 39 System.out.println(sl);
如果您尝试打印对象,它将只打印给定对象的哈希码。
更好地重写程序,如进一步解释:
您可以将逻辑移动到方法中并明确地调用方法(或将逻辑移动到默认的构造函数中),例如:
Songlist
上课应该是这样的:
public class SongsList {
public SongsList(){
runMyCode();
}
public void runMyCode(){
// SongList logic here
}
}
并在歌曲菜单中调用歌曲列表:
case 1:
System.out.println("Album");
SongsList sl = new SongsList();
s1.runMyCode();
// do something...
break;
希望这会对你有所帮助。更好地学习一些OOP概念伙伴......在这样一个基本的Java代码中怀疑是不好的。 尝试从Head第一本java书中学习java:Head First Java.pdf
学习它非常简单有趣。
答案 2 :(得分:1)
我会将代码重构为以下内容:
class Song {
private String title:
private int durationInSeconds;
... //additional attributes as well as getters/setters
}
class Album {
private String name;
private String singer;
private List<Song> songs;
... //additional attributes as well as getters/setters
}
要打印相册,您可以打印其名称,歌手和其他属性,然后迭代歌曲列表并打印出来。
您可以为此覆盖toString()
,但如果您想要多个布局,例如歌曲标题只与歌曲标题加上持续时间,你需要一些其他代码来打印。根据单一责任原则,您不应将打印代码放入数据类中,即Album
或Song
。
示例:
class SongsPrinter {
public static void printSongs(List<Album> albums) {
for( Album album : albums) {
System.out.println( album.getName() );
for( Song song : album.getSongs() ) {
System.out.println("- " + song.getTitle());
}
}
}
}
这样称呼:
List<Album> albums = ... ; //create and fill as you like
SongsPrinter.printSongs(albums);
答案 3 :(得分:0)
在SongsList类中重写toString()menthod并编写逻辑以打印其中可用的所有值。 toString()方法在Object类中是可用的,它是所有类的超类。你可以使用toString()方法来实现你的任务。