我试图找出我的代码有什么问题。它只是不按照我喜欢的方式工作,我想知道是否有人可以帮助我。它应该做的是存储书名和作者的哈希值,并确保不将重复项插入到库ArrayList中。它只是不工作,我不知道如何解决它。
import java.util.*;
@SuppressWarnings("unused")
public class HashTester {
public static void main(String [] args){
/*card.java code
Card x = new Card("jack", "hearts");
x.getHash();
x.getEnglish();
*/
Library k = new Library();
ArrayList<BookHash> library = new ArrayList<BookHash>();
BookHash y = new BookHash("moby dick", "jk rowling");
BookHash y1 = new BookHash("harry potter", "lalala");
BookHash y2 = new BookHash("moby dick", "jk rowling");
k.listBooks();
k.checkBook(y);
k.checkBook(y1);
k.checkBook(y2);
k.listBooks();
}
}
---------------
import java.util.*;
public class Library {
public static ArrayList<BookHash> library = new ArrayList<BookHash>();
BookHash g = new BookHash("moby dick", "jk rowling");
public void checkBook(BookHash x){
for(int i = 0; i <= library.get(i).getHashTitle() -1; i++){
if(library.get(i + 1).getHashTitle()==(library.get(0).getHashTitle())
&& library.get(i + 1).getHashAuthor() == (library.get(0).getHashAuthor())){
System.out.println("book is used");
}
library.add(1, x);
}
}
public void listBooks(){
library.add(g);
for(int i= 0; i< library.size(); i++){
System.out.print( library.get(i).getHashTitle());
System.out.print( library.get(i).getHashAuthor());
}
}
public class BookHash {
int hashTitle;
int hashAuthor;
BookHash(String title, String author){
hashTitle = hashCode(title);
hashAuthor = hashCode(author);
}
public int hashCode(String key){
int hashNumber1 = 7;
for(int i=0; i < key.length(); i++){
hashNumber1 = hashNumber1*31 + key.charAt(i);
}
return hashNumber1;
}
public int getHashTitle(){
return hashTitle;
}
public int getHashAuthor(){
return hashAuthor;
}
}
答案 0 :(得分:1)
您的类BookHash需要覆盖Object类的hashCode()和equals()方法。通常,您可以使用IDE生成这些方法。
然后,您可以使用ArrayList的contains(Object o)方法来检查Object是否已被包含。 =&GT;缩短checkBook-Method
或者您使用Set。集合只能包含每个对象一次。如果将对象添加到Set,则Set会检查它是否已经存在。=&gt;不需要checkBook-Method
Java 8 Doc of Set:https://docs.oracle.com/javase/8/docs/api/java/util/Set.html
例如,您可以使用HashSet。
Java 8 Doc of HashSet:https://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html
我在checkBook-Method中发现了一个错误。 您将字符串与==而不是.equals()进行比较。 如果您比较的两个对象之一可能为null,请使用Objects的equals方法。 请参阅:https://docs.oracle.com/javase/7/docs/api/java/util/Objects.html
应该是这样的:
if(Objects.equals(library.get(i + 1).getHashTitle(), library.get(0).getHashTitle())
&& Objects.equals(library.get(i + 1).getHashAuthor(), library.get(0).getHashAuthor()) {
System.out.println("book is used");
}
但是覆盖hashCode和equals方法并使用ArrayList的contains-method或使用HashSet要容易得多。
我希望这会有所帮助。 : - )