2013-04-06 2 views
0

Я просмотрел несколько мест, и в большинстве примеров аррайалистов в качестве их элементов используется «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, и положить, что инлайн почти такой же объем работы, как создание нового класса.

ответ

1

Mybe вы можете использовать Map<String,Author> для Name-> картографирования Автор, это будет получить его вокруг

+0

Вы предлагаете параллельно хранение карт или заменяющего список? Насколько я знаю, для последнего я могу только собрать объект Collection для авторов. – user1720253

0

Если вы используете реальные данные, имя ужасный выбор. Сколько, по вашему мнению, Джона Смита, что пишут книги?

Вам нужен уникальный идентификатор, и естественные данные не будут его обрезать, поэтому поле искусственного идентификатора является лучшим вариантом.

Для использования идентификатора необходимо переопределить equals(). hashCode() должен основываться на том же поле (-ях), которое использует equals(), поэтому соответственно переопределите это.

Далее следует использовать набор, а не список, который устанавливает неравномерность их элементов. Не нужно проверять.!

+0

Спасибо, но в моей книжной коллекции (чуть более 3000 книг) у меня нет дублирующих авторов. Однако это проблема для поиска. Что касается списка set vs, мне все равно нужно знать, присутствует ли оно или нет, нужно ли мне добавлять или изменять данные, поэтому я не вижу в этом необходимости. – user1720253

0

я, в какой-то степени, подобная ситуация некоторое время назад, и я подошел к проблеме, как это:

  1. Назначить идентификатор каждому автору (или любой уникальный идентификатор). поиска по имени отнимает много время после того, как все
  2. нагрузок всех данных в HashMap<Long, Author>: потому что это быстрее, чтобы проверить HashMap с всеми Authors в нем, чем проверке к базе данных каждый раз.
  3. В O (1), вы можете иметь доступ к Author объекта вы любите hashMap.get(ID)
+0

Помещение данных на карту (Хеш) теряет порядок списка, но в остальном это можно сделать. Если доступ равен O (1), действительно ли имеет значение Long или String? – user1720253

+0

Все имеет свои плюсы и минусы. Нет, не имеет значения, используете ли вы 'Long' или' String' в качестве ключа карты. –

Смежные вопросы