Я просмотрел несколько мест, и в большинстве примеров аррайалистов в качестве их элементов используется «String», однако места, которые используют объекты, трудно найти.Java Arraylist объектов Содержит/равно
Скажем, я работаю над коллекцией книг и у меня есть автор объекта:
class Author {
String name;
<other data>;
int bookCount;
public Author(String n) {
name = n;
}
public boolean equals(Author other) {
if (other.name.equals(name)) { return true;}
return false;
}
}
Так я создать список авторов инстанцированный как ArrayList:
Arraylist<Author> writers;
Так что я хочу выяснить, существует ли автор и создать новую запись, если они не увеличивают или увеличивают значение bookCount, если они это делают. Я могу написать равенства метод по имени в Авторе (как показано выше), а затем сделать что-то вроде:
bookAuthor = "James Gosling"; // normally an input
Author current = new Author(bookAuthor);
if (!writers.contains(current)) {
writers.add(current);
} else {
writers.get(writers.indexOf(current)).bookCount++;
}
Я считаю, что это будет работать, я считаю, что неугодным создавать большое количество объектов, просто чтобы выбросить их после сравнения, но проблема заключается в том, что обычный конструктор для автора не так прост и связан с поиском базы данных (так дорого).
Это означает, что в этом случае все еще можно использовать конструктор name, но мне тогда нужно создать автора дважды. Единственный другой способ, который я могу придумать, - создать новый класс, который наследует от ArrayList и переопределяет Contains и indexOf. Который кажется большим количеством накладных расходов, а затем мне нужно переопределить equals или hashCode или что-то еще в новом классе тоже?
Я что-то упустил, нет ли способа предоставить встроенную функцию или что-то сделать с помощью контейнеров объектов более просто? Я надеялся, что один мог бы сделать что-то вроде:
Arraylist<Author> {equals(String x) { if (x = this.name) { return true;} return false; } writers;
if (!writers.contains(bookAuthor)) {
writers.add(new Author(bookAuthor,dbconn);
} else {
writers.get(writers.indexOf(bookAuthor)).bookCount++;
}
, но, конечно, содержит и IndexOf не имеют подписи String, и положить, что инлайн почти такой же объем работы, как создание нового класса.
Вы предлагаете параллельно хранение карт или заменяющего список? Насколько я знаю, для последнего я могу только собрать объект Collection для авторов. – user1720253