Как проверить, содержит ли Set объект, у которого одна переменная-член равна некоторому значению - PullRequest
0 голосов
/ 13 мая 2011

У меня есть набор Java-объектов Result. Мое определение класса Result выглядит так:

private String url;
private String title;
private Set<String> keywords;

Я сохранил мою информацию в таблице базы данных под названием Ключевые слова, которая выглядит так

Ключевые слова = [идентификатор, URL, заголовок, ключевое слово, дата и время]

Как вы можете видеть, между объектом и строкой в ​​базе данных нет однозначного отображения. Я использую SQL (MySQL DB) для извлечения значений и имею подходящий объект ResultSet.

Как проверить, содержит ли набор Результат с заданным URL-адресом.

Если набор уже содержит объект Result с текущим URL, я просто хочу добавить дополнительное ключевое слово в набор ключевых слов, в противном случае я создаю новый объект Result для добавления в набор объектов Result.

Ответы [ 5 ]

1 голос
/ 13 декабря 2011

Нормализация - твой друг

http://en.wikipedia.org/wiki/Database_normalization

1 голос
/ 13 мая 2011

Когда вы перебираете набор результатов JDBC (чтобы создать свой собственный набор результатов), почему бы вам не поместить их в карту?Чтобы создать карту после факта:

Map<String, List<Result>> map = new HashMap<String, List<Result>>();
for (Result r : resultSet) {
    if (map.containsKey(r.url)) {
        map.get(r.url).add(r);
    } else {
        List<Result> list = new ArrayList<Result>();
        list.add(r);
        map.put(r.url, list);
    }
}

Затем просто используйте map.containsKey(url) для проверки.

0 голосов
/ 13 мая 2011

Я думаю, вам нужно переопределить метод equals () вашего класса Result.В этом методе вы поместите свою логику, которая будет проверять то, что вы ищете.

NB Вам также нужно знать, что для переопределения метода equals () вам необходимо переопределить также метод hashCode ().

Подробнее о теме "переопределение методов equals () и hashCode ()" вы можете найти в this другом вопросе.

0 голосов
/ 13 мая 2011

Вы можете использовать Map с URL-адресами в качестве ключей:

Map<String, Result> map = new HashMap<String, Result>();

for (Result r : results) {
    if (map.containsKey(r.url)) {
        map.get(r.url).keywords.addAll(r.keywords);
    } else {
        map.put(r.url, r);
    }
}
0 голосов
/ 13 мая 2011

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

Я бы предложил две таблицы. Предполагая, что поле id гарантированно будет уникальным, первая таблица будет хранить id, url, title и date-time и иметь только одну строку для каждого идентификатора. Вторая таблица будет хранить идентификатор и ключевое слово. Вы должны вставить несколько строк в эту таблицу, как требуется.

Возможно ли это / имеет ли это смысл?

...