2013-06-05 6 views
0

У меня есть treeMap, содержащий guestbookEntries. Клавиши используются для упорядочивания и разбивки на страницы. У меня проблема: при удалении записи size() из guestbookEntries уменьшается, что приводит к тому, что сообщения перезаписываются, например, потому что я создаю новые записи с ключом guestbookEntries.size() + 1.Заменить TreeMap после удаления()

Чтобы изменить это, я хотел бы изменить порядок TreeMap, чтобы при удалении пары ключ-значение. Количество всех следующих клавиш уменьшается на единицу, поэтому в пределах TreeMap не должно быть «зазора», что приводит к правильному правилу guestbookEntries.size().

Я думал о чем-то подобном, где postNumber - это ключ к удаленной записи.

for(int i = postNumber; i < guestbookEntries.size(); i++) { 
      Guestbook gb = guestbookEntries.get(i + 1); 
      guestbookEntries.put(postNumber, gb); 
      guestbookEntries.remove(postNumber + 1); 
} 

Есть ли более простой способ сделать это?

+0

Это не отвечает на ваш вопрос, но зачем использовать TreeMap? Почему не массив Guestbook (или ArrayList)? – Thierry

+0

Я изначально использовал его, потому что он был заказан автоматически. – mgerstner

ответ

1

Я думаю, что это решение на самом деле очень плохая идея. Представьте, что вы хотели бы создать нумерацию сообщений в своей гостевой книге. Кто-то еще хотел бы ссылаться на эти сообщения своим id. Но когда вы переводите свои сообщения назад, уменьшая их id, вы делаете, вероятно, проблемы для этого человека, который хочет ссылки.

Кроме того, представьте, что кто-то удаляет сообщение # 0, и в вашей гостевой книге уже есть 100 000 сообщений. Затем ваша программа должна будет переместить 99,999 пост-объектов в вашу карту деревьев, уменьшая их число.

Единственное возможное хорошее решение в этом случае, не используйте guestbookEntries.size() + 1 в качестве основы для генерации идентификатора нового сообщения.

Вместо этого просто создайте некоторое статическое целочисленное поле, это будет хорошее решение для использования некоторого готового к одновременному использованию класса, например AtomicInteger.

static AtomicInteger postIdGenerator = new AtomicInteger(0); 

Единственное, что вы должны сделать для решения id на новую должность, является: postIdGenerator.incrementAndGet().

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