gpt4 book ai didi

java - 根据用例自定义 equals 方法

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:46:24 25 4
gpt4 key购买 nike

我有一个类定义为

   class Book{
String author;
String title;
int id;
public boolean equals(Object o){
return id == ((Book)o).id;
}
public int hashCode{...}
}

在大多数情况下,书籍的唯一性由 id 确定,因此可以正常工作。在一种特殊情况下,我想合并两个基于 authortitle 值的列表。我不能直接使用 Set 并将第二个列表添加到 Set,因为比较将发生在 id 而不是作者/标题值上。对我来说唯一的方法是使用两个嵌套的 for 循环来比较每个对象的值。

List<Book> list1=...;
List<Book> list2 = ...;

Iterator<Book> iterator = list1.iterator();
while(iterator.hasNext()){
Book b1 = iterator.next();
for(Book b2:list2){
if(b1.getAuthor().equals(b2.getAuthor()) && b1.getTitle().equals(b2.getTitle())){
iterator.remove();
}
}
}
list2.addAll(list1);

有什么方法可以根据用例重写 equals 方法(类似于我们可以更改排序算法的 Comparator)?

取而代之的是自定义 equals 方法来检查作者的值并以某种方式跟随作品

set.addAll(list2);

最佳答案

你可以用闭包来做一些类似的事情,但它本身并不是最重要的。你遇到的问题是这是一个 O(N*M) 时间复杂度,这不是想法。一个更好的方法是 O(N) 是

Map<String, Book> books = new LinkedHashMap<>();
for (Book book : list1) books.put(book.author+"/"+book.title, book);
for (Book book : list2) books.remove(book.author+"/"+book.title);
list2.addAll(books.values());

对于闭包,您需要一些我找不到的函数。

static class MapStream<K, V> {
final Map<K, V> map;
final Function<V, K> func;

MapStream(Iterable<V> values, Function<V, K> func) {
map = new LinkedHashMap<>();
this.func = func;
addAll(values);
}

private void addAll(Iterable<V> values) {
for (V value : values)
map.put(func.apply(value), value);
}

public MapStream<K, V> removeAll(Iterable<V> values) {
for (V value : values) {
map.remove(func.apply(value));
}
return this;
}

public Collection<V> values() {
return map.values();
}
}


public static <T> Function<T, String> and(Function<T, String> func1, Function<T, String> func2) {
return (T t) -> func1.apply(t) + "\uffff" + func2.apply(t);
}


public static void main(String... ignored) {
List<Book> list1 = new ArrayList<>();
List<Book> list2 = new ArrayList<>();

Function<Book, String> commonKey = and((Book b) -> b.author, (Book b) -> b.title);
list2.addAll(new MapStream<>(list1, commonKey).removeAll(list2).values());
}

你可以看到,在一些支持下,你可以看到带有闭包的东西。

关于java - 根据用例自定义 equals 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23385056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com