Java 检查列表中的参数是否重复

Java 检查列表中的参数是否重复,java,intellij-idea,arraylist,Java,Intellij Idea,Arraylist,我的方法有问题。我应该制作一个图书馆类,在这个类中,我向一个列表中添加3本书。完成了。我必须检查这些书是否有相同的参数(ISBN),这部分我有问题 public class Library { public static void main(String[] args) { Book MacMasterRaceVolumeOne = new Book(252510, 2019, "MacMasterRaceVolumeOne"); Book MacM

我的方法有问题。我应该制作一个图书馆类,在这个类中,我向一个列表中添加3本书。完成了。我必须检查这些书是否有相同的参数(ISBN),这部分我有问题

public class Library {
    public static void main(String[] args) {

    Book MacMasterRaceVolumeOne = new Book(252510, 2019, "MacMasterRaceVolumeOne");
    Book MacMasterRaceVolumeTwo = new Book(252511, 2020, "MacMasterRaceVolumeTwo");
    Book MacMasterRaceVolumeThree = new Book(252512, 2021, "MacMasterRaceVolumeThree");
    ArrayList<Book> bookList = new ArrayList<>();

    bookList.add(MacMasterRaceVolumeOne);
    bookList.add(MacMasterRaceVolumeTwo);
    bookList.add(MacMasterRaceVolumeThree);
    System.out.println(bookList.);
公共类库{
公共静态void main(字符串[]args){
Book MacMasterRaceVolumeOne=新书(2525102019,“MacMasterRaceVolumeOne”);
Book MacMasterRaceVolumeTwo=新书(2525112020,“MacMasterRaceVolumeTwo”);
Book MacMasterRaceVolumeTree=新书(252512,2021,“MacMasterRaceVolumeTree”);
ArrayList bookList=新建ArrayList();
图书目录。添加(MacMasterRaceVolumeOne);
图书目录。添加(MacMasterRaceVolumeTwo);
图书目录。添加(MacMasterRaceVolumeTree);
System.out.println(图书列表);
到目前为止还不错。 现在我的问题来自下一部分,检查ISBN是否被复制

public boolean isISBNMatching(Book bookHere, ArrayList<Book> list) {
    if ((list.contains(bookHere.getISBN() == bookHere.getISBN())){
        return true;
    } 
        return false;
    }
}   
public boolean ISISSBNMATCH(bookHere,ArrayList列表){
if((list.contains(bookHere.getISBN()==bookHere.getISBN())){
返回true;
} 
返回false;
}
}   
我可以看出我的想法是有缺陷的,但我认为我的方向是正确的。虽然我看不出正确的答案

希望我的问题是好的。 保持安全和友善,这里有很多问题

  • Java约定是编写
    getIsbn
    ,而不是
    getIsbn

  • 使用整数表示ISBN是完全错误的;整数限制为9个完整数字(不能包含任何大于2^31-1的数字,即10位数),ISBN有13个。你可以使用long,但对ISBN使用
    long
    是危险的:a
    long
    是一个数字,它意味着“数学”。将两个ISBN相加或增加一个ISBN绝对没有任何意义。这是一个强有力的指标,表明
    long
    不合适。很可能是
    java.lang.String
    是合适的,或者创建一个自定义类型:
    类Isbn
    ,它将数据保存在封装的东西中(a <代码>长)在这里更为可行,你可以限制代码,甚至可以看到长到几行的代码,从而使它更容易推理-在这几行中,你可能不会被诱惑考虑这么长的数学概念,例如考虑添加ISBN一起。
  • 换句话说,ISBN应该是一个对象,您必须将对象与
    .equals()
    进行比较。原语与
    =
    进行比较。您将与单个
    =
    进行比较,后者根本不是比较,而是赋值运算符,并且该代码不会编译

  • 您的列表中没有ISBN,它包含书籍。计算机只是按照您的要求去做,并且没有自己的大脑,因此,如果您问它:“这个图书列表中是否包含这个ISBN?”计算机会尽职尽责地回答。它总是回答“不”,出于同样的原因,如果你问我一盒普林格尔酒是否有火车站,我可以如实回答:不,没有

  • 如果必须,您可以循环浏览整个列表,对于列表中的每本书,获取其ISBN,然后检查:

    public boolean doesListContain(Book book, List<Book> list) {
        for (Book b : list) if (b.getIsbn().equals(book.getIsbn())) return true;
        return false;
    }
    
    第二步:为你的图书馆使用地图
    Map-library=newhashmap();
    //要添加一本书:
    library.put(book.getIsbn(),book);
    //要检查Isbn是否已存在,请执行以下操作:
    布尔值alreadyIn=library.containsKey(book.getIsbn());
    //通过isbn取书:
    Book b=library.get(someIsbn);//如果找不到,则为null
    //添加一本书,但仅限于尚未添加的情况。
    library.putIfAbsent(book.getIsbn(),book);
    
    忘记列表吧。它不是此任务的适当数据结构

  • 如果这对你有意义,你可以定义ISBN告诉你两本书是否相等。如下所示:

     public class Book {
     private int ISBN;
     private int year;
     private String name;
    
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         Book book = (Book) o;
         return ISBN == book.ISBN;
     }
    
     @Override
     public int hashCode() {
         return Objects.hash(ISBN);
        }
     }
    
  • 然后你可以这样做:

      if ((list.contains(bookHere)){
          // what you intend to do
      } 
    
    这牺牲了时间复杂性,但在您的用例中可能不需要考虑它

  • 你可以维护一张地图并检查是否有重复的书

  • 为了检查给定书籍的ISBN是否已经存在于列表中,您需要迭代列表并检查是否有任何具有相同ISBN的书籍。因此
    isISBNMatching
    如下所示:

    public boolean ISISSBNMATCH(bookHere,ArrayList列表){
    返回list.stream().anyMatch(b->b.getISBN()==bookHere.getISBN());
    }
    
    使用java流解决了这个问题

        public static void main(String[] args) {
    
            Book MacMasterRaceVolumeOne = new Book(252510, 2019, "MacMasterRaceVolumeOne");
            Book MacMasterRaceVolumeTwo = new Book(252511, 2020, "MacMasterRaceVolumeTwo");
            Book MacMasterRaceVolumeThree = new Book(252512, 2021, "MacMasterRaceVolumeThree");
            Book MacMasterRaceVolumeFour = new Book(252512, 2021, "MacMasterRaceVolumeFour");
            List<Library.Book> bookList = new ArrayList<>();
        
            bookList.add(MacMasterRaceVolumeOne);
            bookList.add(MacMasterRaceVolumeTwo);
            bookList.add(MacMasterRaceVolumeThree);
            bookList.add(MacMasterRaceVolumeFour);
            
            bookList = bookList.stream()
                .filter(distinctByKey(Book::getISBN))
                .collect(Collectors.toList());
            
            System.out.println("Book list:");
            bookList.stream().forEach(System.out::println); 
            
        }
        
        public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
            Set<Object> seen = ConcurrentHashMap.newKeySet();
            return t -> seen.add(keyExtractor.apply(t));
        }
    

    好的,你可以做的一件事是根据isbn生成一个频率图,每当你得到一个大于1的频率时(即,有多本书有相同的isbn)您有一个重复的。或者,按isbn对列表进行排序,并检查相邻书籍的编号。如果您的目标是查找具有相同isbn的重复书籍,则可以在Book对象上实现Comparable并重写equals()和hashCode(),然后将其存储在类似HashSet的集合中。或者,使用ArrayList并使用Collections.sort()进行排序我喜欢这个,首先,非常感谢你的详细描述。感谢你花时间来帮助我!我确实考虑过让它长而不是int,但是从来没有给出过一个想法。我们还没有真正地浏览过地图,但是我一定要检查一下,因为最后循环太慢了。再次,非常感谢
      if ((list.contains(bookHere)){
          // what you intend to do
      } 
    
        public static void main(String[] args) {
    
            Book MacMasterRaceVolumeOne = new Book(252510, 2019, "MacMasterRaceVolumeOne");
            Book MacMasterRaceVolumeTwo = new Book(252511, 2020, "MacMasterRaceVolumeTwo");
            Book MacMasterRaceVolumeThree = new Book(252512, 2021, "MacMasterRaceVolumeThree");
            Book MacMasterRaceVolumeFour = new Book(252512, 2021, "MacMasterRaceVolumeFour");
            List<Library.Book> bookList = new ArrayList<>();
        
            bookList.add(MacMasterRaceVolumeOne);
            bookList.add(MacMasterRaceVolumeTwo);
            bookList.add(MacMasterRaceVolumeThree);
            bookList.add(MacMasterRaceVolumeFour);
            
            bookList = bookList.stream()
                .filter(distinctByKey(Book::getISBN))
                .collect(Collectors.toList());
            
            System.out.println("Book list:");
            bookList.stream().forEach(System.out::println); 
            
        }
        
        public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
            Set<Object> seen = ConcurrentHashMap.newKeySet();
            return t -> seen.add(keyExtractor.apply(t));
        }
    
    Book list:
    Book [ISBN=252510, date=2019, title=MacMasterRaceVolumeOne]
    Book [ISBN=252511, date=2020, title=MacMasterRaceVolumeTwo]
    Book [ISBN=252512, date=2021, title=MacMasterRaceVolumeThree]