3

I have created an array of Song objects. A song contains the variables title, author, interpreter, (int)yearReleased, album, and fileName. I am using a main method to test my array of songs and my equals method. The test is supposed to fill an array with five song objects and use my equals method to ensure the new entry is not a duplicate of a previous entry. My test class compiles, but when I enter duplicate song information I keep getting an error. If anyone could give me a tip or point me in the correct direction I would greatly appreciate it. Any other tips would also be great. As a student, it is great to hear good real world advice from professionals.

 import java.util.Scanner;

 public class Test{
 public static void main(String[] args)
 {
    Scanner kybd = new Scanner(System.in);

    Song[] songTest = new Song[5];
    boolean match;
    int count = 0;

    System.out.println("Enter 5 songs\n");

    for(Song x:songTest)
    {
        do{
            match = false;
            x = new Song();
            System.out.print("Title: ");
            x.setTitle(kybd.nextLine());
            System.out.print("Author: ");
            x.setAuthor(kybd.nextLine());
            System.out.print("Interpreter: ");
            x.setInterpreter(kybd.nextLine());
            System.out.print("Year released: ");
            x.setYearReleased(kybd.nextInt());
            kybd.nextLine();
            System.out.print("Album: ");
            x.setAlbum(kybd.nextLine());
            System.out.print("File name: ");
            x.setFileName(kybd.nextLine());
            System.out.print(x);
            System.out.println();
            for(int i = 0; i<count; i++)
                if(songTest[i].equals(x)){
                    match = true;
                    System.out.print("Duplicate");
                }
        }while(match);
        count++;
    }
}
}




public class Song
{
public String title;
public String author;
public String interpreter;
public int yearReleased;
public String album;
public String fileName;

//private vars
private int reviewScore = 0;
private int reviews = 0;
private double average;

//Mutator methods

public void setTitle(String t)
{
    this.title = t;
}

public void setAuthor(String a)
{
    this.author = a;
}

public void setInterpreter(String i)
{
    this.interpreter = i;
}

public void setYearReleased(int y)
{
    if (y>0)
        this.yearReleased = y;
    else
    {
        System.out.print ("This song is not that old");
        this.yearReleased = -5;
    }
}

public void setAlbum(String a)
{
    this.album = a;
}

public void setFileName(String f)
{
    this.fileName = f;
}

public void addReviewScore(int s)
{
    if (s>0 && s<6)
    {
        this.reviewScore += s;
        this.reviews++;
    }
    else
        System.out.print("This is not a valid review score!");
}

//Accessor methods

public String getTitle()
{
    return this.title;
}

public String getAuthor()
{
    return this.author;
}

public String getInterpreter()
{
    return this.interpreter;
}

public int getYearReleased()
{
    return this.yearReleased;
}

public String getAlbum()
{
    return this.album;
}

public String getFileName()
{
    return this.fileName;
}

public double getAverage()
{
    this.average = this.calculateAverage();
    return this.average;
}

//Methods

public boolean equals(Song otherSong)
{
    boolean isEqual = false;
    //compare this song to the otherSong
    isEqual =
        this.title == otherSong.title &&
        this.author == otherSong.author &&
        this.interpreter == otherSong.interpreter &&
        this.yearReleased == otherSong.yearReleased &&
        this.album == otherSong.album &&
        this.fileName == otherSong.fileName;
    return isEqual;
}
public String toString()
{
    String songInfo;
    songInfo = 
        "***Song information***\n" +
        "Title: " + this.title + 
        "\nAuthor: " + this.author +
        "\nInterpreter: " + this.interpreter +
        "\nYear Released: " + this.yearReleased +
        "\nAlbum: " + this.album +
        "\nFile name: " + this.fileName +
        "\nYears old: " + this.yearsOld(); 
    return songInfo;
}

public int yearsOld()
{
    int yearsOld = (2012 - this.yearReleased);
    return yearsOld;
}

//Private methods
private double calculateAverage()
{
    this.average = ((double)this.reviewScore/(double)this.reviews);
    return this.average;

}

}

4

2 回答 2

2

我尝试了您的代码并重现了在这一行发生的错误:

                if(songTest[i].equals(x)){

重写你的equals方法(或让eclipse为我做)并添加hashCode()解决了这个问题:

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((album == null) ? 0 : album.hashCode());
    result = prime * result + ((author == null) ? 0 : author.hashCode());
    long temp;
    temp = Double.doubleToLongBits(average);
    result = prime * result + (int) (temp ^ (temp >>> 32));
    result = prime * result
            + ((fileName == null) ? 0 : fileName.hashCode());
    result = prime * result
            + ((interpreter == null) ? 0 : interpreter.hashCode());
    result = prime * result + reviewScore;
    result = prime * result + reviews;
    result = prime * result + ((title == null) ? 0 : title.hashCode());
    result = prime * result + yearReleased;
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Song other = (Song) obj;
    if (album == null) {
        if (other.album != null)
            return false;
    } else if (!album.equals(other.album))
        return false;
    if (author == null) {
        if (other.author != null)
            return false;
    } else if (!author.equals(other.author))
        return false;
    if (Double.doubleToLongBits(average) != Double
            .doubleToLongBits(other.average))
        return false;
    if (fileName == null) {
        if (other.fileName != null)
            return false;
    } else if (!fileName.equals(other.fileName))
        return false;
    if (interpreter == null) {
        if (other.interpreter != null)
            return false;
    } else if (!interpreter.equals(other.interpreter))
        return false;
    if (reviewScore != other.reviewScore)
        return false;
    if (reviews != other.reviews)
        return false;
    if (title == null) {
        if (other.title != null)
            return false;
    } else if (!title.equals(other.title))
        return false;
    if (yearReleased != other.yearReleased)
        return false;
    return true;
}

你似乎也有计数器没有正确递增的问题,但我不会为你做所有的功课!;)

编辑:哇!您还缺少类似的东西

       songTest[i] = song;

将选中的歌曲添加到您的阵列中。

另外,为了确保您的第一首歌被放入,我添加了:

if(i==0){
        songTest[i] = x;
}

在您检查之前。我通过将您的第一个 for 循环更改回老式版本添加了 i is 和 int,并且我将您的内部 for 循环重命名为 j。现在它起作用了。尝试放入类似的东西:

System.out.println("i: " + i + " j: " + j + " count: " + count);

看看你的柜台发生了什么

您也可以在找到重复项后退出。这是你想要的行为吗?还是通知用户,继续输入歌曲数据比较好。

于 2012-09-26T02:03:39.710 回答
1

当我运行它时,我在这一行得到一个空指针异常

if(songTest[i].equals(x)){

看起来您实际上并没有将歌曲对象 (x) 放入数组中。

于 2012-09-26T02:00:34.673 回答