返回列表从一个类调用到另一个类

时间:2012-03-21 08:28:21

标签: java

我是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'我希望最终能够按照专辑,姓名和搜索的顺序列出。

任何建议都非常感谢。

4 个答案:

答案 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(),但如果您想要多个布局,例如歌曲标题只与歌曲标题加上持续时间,你需要一些其他代码来打印。根据单一责任原则,您不应将打印代码放入数据类中,即AlbumSong

示例:

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()方法来实现你的任务。