我创建了一个Song对象数组。一首歌包含变量title,author,interpreter,(int)yearReleased,album和fileName。我正在使用main方法来测试我的歌曲数组和我的equals方法。该测试应该用五个歌曲对象填充数组并使用我的equals方法来确保新条目不是前一个条目的副本。我的测试类编译,但当我输入重复的歌曲信息时,我不断收到错误。如果有人能给我一个提示或指出我正确的方向,我将非常感激。任何其他提示也会很棒。作为一名学生,很高兴听到专业人士提出的真实世界建议。
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;
}
}
答案 0 :(得分: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;
}
检查前。 i和int我通过将你的第一个for循环改回旧版本来添加,并且我将你的内部for循环重命名为j。 现在它有效。 尝试加入类似的东西:
System.out.println("i: " + i + " j: " + j + " count: " + count);
了解您的计数器发生了什么
您也会在找到重复后退出。这是你想要的行为吗?或者最好是通知用户,并继续输入歌曲数据。
答案 1 :(得分:1)
当我运行它时,我在此行上得到一个空指针异常
if(songTest[i].equals(x)){
看起来你并没有真正将歌曲对象(x)放入数组中。