Java 检查列表中的参数是否重复
我的方法有问题。我应该制作一个图书馆类,在这个类中,我向一个列表中添加3本书。完成了。我必须检查这些书是否有相同的参数(ISBN),这部分我有问题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
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;
}
}
我可以看出我的想法是有缺陷的,但我认为我的方向是正确的。虽然我看不出正确的答案
希望我的问题是好的。
保持安全和友善,这里有很多问题
getIsbn
,而不是getIsbn
long
是危险的:along
是一个数字,它意味着“数学”。将两个ISBN相加或增加一个ISBN绝对没有任何意义。这是一个强有力的指标,表明long
不合适。很可能是java.lang.String
是合适的,或者创建一个自定义类型:类Isbn
,它将数据保存在封装的东西中(a <代码>长)在这里更为可行,你可以限制代码,甚至可以看到长到几行的代码,从而使它更容易推理-在这几行中,你可能不会被诱惑考虑这么长的数学概念,例如考虑添加ISBN一起。
.equals()
进行比较。原语与=
进行比较。您将与单个=
进行比较,后者根本不是比较,而是赋值运算符,并且该代码不会编译
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);
忘记列表吧。它不是此任务的适当数据结构
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]