哈希库代码辅助

时间:2018-03-26 12:04:48

标签: java regex arraylist project

我试图找出我的代码有什么问题。它只是不按照我喜欢的方式工作,我想知道是否有人可以帮助我。它应该做的是存储书名和作者的哈希值,并确保不将重复项插入到库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;
    }
}

1 个答案:

答案 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要容易得多。

我希望这会有所帮助。 : - )