как сравнить, чтобы избежать вставки повторяющихся данных в arraylist

у меня есть класс, в котором я вставляю данные в список массивов на основе предоставленного идентификатора. Я передаю bookId в свой класс и, сравнивая bookid, получаю объект книги. И после получения этого объекта (книги) я вставляю его в свой массив. Теперь я не хочу вставлять одни и те же данные более одного раза. Если в классе проходит один и тот же идентификатор книги, то он должен храниться только один раз.
Я сохраняю свой список массивов в сеансе.

пожалуйста, проверьте мой код. И предложите мне решение моей проблемы.Как избежать повторной вставки данных в мой arraylist?

Аддбуктосессион.java

   ..................
   ...................
    ...................
    private Integer bid;  HttpServletRequest request = ServletActionContext.getRequest();  
    private Map<String, Object> session; 
    List<Bookdetails> books = new ArrayList<Bookdetails>();
    private BookdetailsDAO dao = new BookdetailsDAO(); 

    public String execute() 
    {  
           String bookid = request.getParameter("bid");    
        Bookdetails book = dao.listBookDetailsById(Integer.parseInt(bookid));
        int checkduplicate=1;

           //getting list from session to compare with the id
        List list = (List) session.get( VisionBooksConstants.USER );  
           Iterator itr = list.iterator(); 
           int bidd=0;

        while(itr.hasNext())
        { 
            Bookdetails bks=(Bookdetails) itr.next();
            bidd=bks.getId(); //getting bookid from arraylist,which was stored in session
            if (bidd==Integer.parseInt(bookid))
            {
           checkduplicate=0; //returns 0 ,so that i can compare it below to avoid duplicate data
         }
        }
         //
        if (book != null && checkduplicate==1  ) 
        { 
            books = sessionBooks();
            HttpServletRequest request = ServletActionContext.getRequest();  
            books.add(book);
            System.out.println("books size"+books.size()); 
        }

        return SUCCESS;
    } 
       ........................
        ...................... 

Альтернативное решение обновление HashSet()

  public String execute() 
    {    HashSet<Bookdetails> books = new HashSet<Bookdetails>();
          String bookid = request.getParameter("bid");    
          Bookdetails book = dao.listBookDetailsById(Integer.parseInt(bookid));
          books =  (HashSet<Bookdetails>) session.get(BillTransactionBooksConstants.BOK);
          if ( books == null ) books = new HashSet<Bookdetails>();
           boolean already_exists = false; 
            books.add(book);
            System.out.println("books size"+books.size()); 
            session.put(BillTransactionBooksConstants.BOK,books);

        return SUCCESS;
    } 

Bookdetails.java(Pojo)

        package v.esoft.pojos;

    // Generated Nov 5, 2012 9:37:14 PM by Hibernate Tools 3.4.0.CR1

    import java.util.Date;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import static javax.persistence.GenerationType.IDENTITY;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;


    /**
     * Bookdetails generated by hbm2java
     */
    @Entity
    @Table(name = "bookdetails", catalog = "vbsoftware")
    public class Bookdetails implements java.io.Serializable {

        private Integer id;
        private String isbn;
        private String bookTitile;
        private String authFirstname;
        private String authLastname;
        private String editionYear;
        private Integer subjectId;
        private Integer coverId;
        private Integer languageId;
        private String publisherName;
        private Integer editionId;
        private Float price;
        private String quantity;
        private String description;
        private Integer locationId;
        private String remarks;
        private String img1;
        private String img2;
        private String videoUrl;
        private Integer createrId;
        private Date createdDate;
        private Integer updateId;
        private Date updatedDate;

        public Bookdetails() {
        }

        public Bookdetails(String isbn, String bookTitile, String authFirstname,
                String authLastname, String editionYear, Integer subjectId,
                Integer coverId, Integer languageId, String publisherName,
                Integer editionId, Float price, String quantity,
                String description, Integer locationId, String remarks,
                String img1, String img2, String videoUrl, Integer createrId,
                Date createdDate, Integer updateId, Date updatedDate) {
            this.isbn = isbn;
            this.bookTitile = bookTitile;
            this.authFirstname = authFirstname;
            this.authLastname = authLastname;
            this.editionYear = editionYear;
            this.subjectId = subjectId;
            this.coverId = coverId;
            this.languageId = languageId;
            this.publisherName = publisherName;
            this.editionId = editionId;
            this.price = price;
            this.quantity = quantity;
            this.description = description;
            this.locationId = locationId;
            this.remarks = remarks;
            this.img1 = img1;
            this.img2 = img2;
            this.videoUrl = videoUrl;
            this.createrId = createrId;
            this.createdDate = createdDate;
            this.updateId = updateId;
            this.updatedDate = updatedDate;
        }

        @Id
        @GeneratedValue(strategy = IDENTITY)
        @Column(name = "id", unique = true, nullable = false)
        public Integer getId() {
            return this.id;
        }

        public void setId(Integer id) {
            this.id = id;
        }


        //########################################################################### 
                        //  FOR HASHSETS EQUALS
        //########################################################################### 
        public Bookdetails(int i){ id = i; }

        public boolean equals(Object obj){
            System.err.println("called"); // Never happens
            return id == ((Bookdetails)obj).id;
        }


        @Column(name = "isbn", length = 90)
        public String getIsbn() {
            return this.isbn;
        }

        public void setIsbn(String isbn) {
            this.isbn = isbn;
        }

        @Column(name = "book_titile")
        public String getBookTitile() {
            return this.bookTitile;
        }

        public void setBookTitile(String bookTitile) {
            this.bookTitile = bookTitile;
        }

        @Column(name = "auth_firstname", length = 120)
        public String getAuthFirstname() {
            return this.authFirstname;
        }

        public void setAuthFirstname(String authFirstname) {
            this.authFirstname = authFirstname;
        }

        @Column(name = "auth_lastname", length = 120)
        public String getAuthLastname() {
            return this.authLastname;
        }

        public void setAuthLastname(String authLastname) {
            this.authLastname = authLastname;
        }

        @Column(name = "edition_year", length = 20)
        public String getEditionYear() {
            return this.editionYear;
        }

        public void setEditionYear(String editionYear) {
            this.editionYear = editionYear;
        }

        @Column(name = "subject_id")
        public Integer getSubjectId() {
            return this.subjectId;
        }

        public void setSubjectId(Integer subjectId) {
            this.subjectId = subjectId;
        }

        @Column(name = "cover_id")
        public Integer getCoverId() {
            return this.coverId;
        }

        public void setCoverId(Integer coverId) {
            this.coverId = coverId;
        }

        @Column(name = "language_id")
        public Integer getLanguageId() {
            return this.languageId;
        }

        public void setLanguageId(Integer languageId) {
            this.languageId = languageId;
        }

        @Column(name = "publisher_name", length = 70)
        public String getPublisherName() {
            return this.publisherName;
        }

        public void setPublisherName(String publisherName) {
            this.publisherName = publisherName;
        }

        @Column(name = "edition_id")
        public Integer getEditionId() {
            return this.editionId;
        }

        public void setEditionId(Integer editionId) {
            this.editionId = editionId;
        }

        @Column(name = "price", precision = 12, scale = 0)
        public Float getPrice() {
            return this.price;
        }

        public void setPrice(Float price) {
            this.price = price;
        }

        @Column(name = "quantity", length = 40)
        public String getQuantity() {
            return this.quantity;
        }

        public void setQuantity(String quantity) {
            this.quantity = quantity;
        }

        @Column(name = "description", length = 65535)
        public String getDescription() {
            return this.description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        @Column(name = "location_id")
        public Integer getLocationId() {
            return this.locationId;
        }

        public void setLocationId(Integer locationId) {
            this.locationId = locationId;
        }

        @Column(name = "remarks", length = 65535)
        public String getRemarks() {
            return this.remarks;
        }

        public void setRemarks(String remarks) {
            this.remarks = remarks;
        }

        @Column(name = "img1")
        public String getImg1() {
            return this.img1;
        }

        public void setImg1(String img1) {
            this.img1 = img1;
        }

        @Column(name = "img2")
        public String getImg2() {
            return this.img2;
        }

        public void setImg2(String img2) {
            this.img2 = img2;
        }

        @Column(name = "video_url", length = 65535)
        public String getVideoUrl() {
            return this.videoUrl;
        }

        public void setVideoUrl(String videoUrl) {
            this.videoUrl = videoUrl;
        }

        @Column(name = "creater_id")
        public Integer getCreaterId() {
            return this.createrId;
        }

        public void setCreaterId(Integer createrId) {
            this.createrId = createrId;
        }

        @Temporal(TemporalType.TIMESTAMP)
        @Column(name = "created_date", length = 19)
        public Date getCreatedDate() {
            return this.createdDate;
        }

        public void setCreatedDate(Date createdDate) {
            this.createdDate = createdDate;
        }

        @Column(name = "update_id")
        public Integer getUpdateId() {
            return this.updateId;
        }

        public void setUpdateId(Integer updateId) {
            this.updateId = updateId;
        }

        @Temporal(TemporalType.TIMESTAMP)
        @Column(name = "updated_date", length = 19)
        public Date getUpdatedDate() {
            return this.updatedDate;
        }

        public void setUpdatedDate(Date updatedDate) {
            this.updatedDate = updatedDate;
        }

    }

person Dan    schedule 11.11.2012    source источник
comment
Включайте только соответствующий код.   -  person Dave Newton    schedule 11.11.2012
comment
@DaveNewton Я добавил это, потому что люди поймут мой код в деталях. Но сейчас удалил.   -  person Dan    schedule 11.11.2012
comment
Все, что им нужно, — это код, участвующий в определении наличия повторяющейся записи в списке. На самом деле кажется, что вы пытаетесь написать код путем с головой — это базовые вещи Java. Для вас было бы более эффективно провести некоторое время с некоторыми базовыми руководствами, а не задавать каждый вопрос, который у вас есть, IMO.   -  person Dave Newton    schedule 11.11.2012


Ответы (2)


EDITED: Теперь это должно работать.

  public String execute() 
    {  
        String bookid = request.getParameter("bid");    
        Bookdetails book = dao.listBookDetailsById(Integer.parseInt(bookid));
        books = (ArrayList) session.get( VisionBooksConstants.USER );  
        if ( books == null ) books = new ArrayList<Bookdetails>();
        boolean already_exists = false;
        for ( Bookdetails b : books ) {
            if ( b.getID().equals(bookid) ) {
                already_exists = true; break;
            }
        }
        if (book != null && !already_exists  ) 
        { 
            books.add(book);
            System.out.println("books size"+books.size()); 
            session.put(VisionBooksConstants.USER,books);
        }
        return SUCCESS;
    } 
person Willem    schedule 11.11.2012
comment
Та же проблема. Он добавляет одну и ту же запись более одного раза. Только что я обновил свой вопрос полным кодом. Пожалуйста, проверьте. И в вашем коде вам не хватало вставки } или { . И у этого if ( books == null ) нет ни закрывающих, ни открывающих фигурных скобок. - person Dan; 11.11.2012
comment
извините, тем не менее он добавляет одну и ту же запись более одного раза. - person Dan; 11.11.2012
comment
вы удалили класс Bookdetails. Я бы проверил, возвращает ли метод b.getID() строковое представление идентификатора или что-то еще (например, Integer). Чтобы получить строковое представление целого числа, используйте. Если это целое число, которое оно возвращает, измените часть if ( b.getID().equals(bookid) ) на if ( Integer.toString(b.getID()).equals(bookid)). - person Willem; 11.11.2012
comment
Работает нормально сейчас. Я изменил if ( b.getID().equals(bookid) ) на if ( Integer.toString(b.getID()).equals(bookid)) . - person Dan; 11.11.2012
comment
Теперь я попытаюсь решить эту же проблему, используя Set And Hashcode. Итак, что мне нужно изучить Hashcode и Set, чтобы избежать дублирования вставки данных в arraylist. Или что-нибудь еще? - person Dan; 11.11.2012
comment
Вы должны просто переопределить метод equals в своем классе Bookdetails. Я думаю, что нет большой необходимости реализовывать собственную хеш-функцию. Затем вместо ArrayList просто используйте HashSet. С ним вам не нужно ничего проверять, метод add позаботится о повторяющихся записях. - person Willem; 11.11.2012
comment
да .. Я понял. Я узнаю новое. Теперь мне нужно удалить данные из моего массива по bookId. Точно так же, как вы упоминаете метод добавления для добавления новой записи в мой список массивов (тот же код, что и выше). Вместо books.add(book); я сделал books.remove(book);, но запись не удаляется из моего массива books. Просто проверьте и дайте мне знать, почему моя запись не удаляется? - person Dan; 11.11.2012
comment
я также пытался добавить тот же метод, чтобы добавить книгу по идентификатору, используя HashSet . Но это не работает, снова добавляет дубликаты данных в мой список. Пожалуйста, проверьте мое обновление HashSet выше. - person Dan; 11.11.2012
comment
Можете ли вы опубликовать свой метод equals для класса Bookdetails? - person Willem; 11.11.2012
comment
Пожалуйста, проверьте Bookdetails.java(Pojo) в моем классе обновления выше. Внутри него я написал, что есть метод equals. - person Dan; 11.11.2012
comment
измените последнюю строку в методе equals на: return id.equals((Bookdetails)o).id Вы уверены, что метод equals никогда не вызывается? - person Willem; 11.11.2012
comment
вернуть id.equals((Bookdetails)o).id); - person Willem; 11.11.2012

Как избежать дублирования вставки данных в мой массив?

Вместо этого используйте набор.

Кроме того, убедитесь, что вы правильно реализуете equals и hashcode.

person NimChimpsky    schedule 11.11.2012
comment
Он не должен использовать набор, который ему нужен только для сравнения их по id. Это означает, что метод equals будет сравнивать только идентификаторы, а не всю другую информацию, хранящуюся в классе. Обычно это не очень хорошая практика. - person Willem; 11.11.2012
comment
@AndrejGajduk В вопросе нет метода equals, поэтому он проверяет, является ли экземпляр одинаковым. Вот почему я сказал, что убедитесь, что все реализовано правильно. Вам нужна структура данных, которая гарантирует отсутствие дубликатов, и вы не хотите использовать набор...? - person NimChimpsky; 11.11.2012
comment
@NimChimpsky Каков стандартный способ сделать это, как вы сказали? Обычно это не очень хорошая практика. . Пожалуйста, покажите мне способ, чтобы я узнал что-то новое, и в следующий раз я это реализую. - person Dan; 11.11.2012
comment
@AshutoshSingh стандартный способ сделать что? равно и хэш-код? множество примеров по всему этому сайту (переходные, отражающие, симметричные, последовательные). - person NimChimpsky; 11.11.2012
comment
@NimChimpsky Можете ли вы опубликовать ответ на мой вопрос, используя хэш-код? Так что в следующий раз я буду использовать хэш-код для таких проблем. - person Dan; 11.11.2012
comment
@AshutoshSingh, извините, нет. Почитайте об этом на этом сайте, подумайте и попробуйте. Это лучший способ узнать, а затем вернуться с более конкретным вопросом, если это необходимо. Удачи. - person NimChimpsky; 11.11.2012
comment
@NimChimpsky Спасибо, я прочитал и реализовал HashSet, это очень просто и эффективно. Нет необходимости писать дополнительный код, чтобы избежать дублирования данных. Спасибо еще раз. Я узнаю новое\ - person Dan; 11.11.2012
comment
@NimChimpsky Я пробовал то же самое, используя Hashsets после прочтения документов. Но все же он добавляет дубликаты данных. Пожалуйста, проверьте мой код выше. - person Dan; 11.11.2012