|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
rage : 27 Новичок
|
Июн 03, 2011 9:09 |
|
|
| Нужна коллекция аналогичная ConcurrentSkipListSet но, что бы при добавлении равного объекта он заменял уже существующий. |
|
|
|
 |
Skipy : 4801 Я тут живу! Откуда: Москва, Россия
|
Июн 03, 2011 9:16 |
|
|
А этот по какой-то причине перестал заменять? Если Вы не заметили - это реализация java.util.Set. _________________ С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других! |
|
|
|
 |
rage : 27 Новичок
|
Июн 03, 2011 9:35 |
|
|
Не знаю как у вас, но у меня не заменяет если компаратор возвращает 0, то добавляемый объект отбрасывается, остается тот который был добавлен первым.
| Код: |
public class MyObject
{
public final int a;
public final int weight;
public MyObject(int a, int weight)
{
this.a = a;
this.weight = weight;
}
@Override
public String toString()
{
return a + " " + weight;
}
}
public class TaskComparator implements Comparator<MyObject>
{
public int compare(MyObject o1, MyObject o2)
{
if(o1 == null || o2 == null)
return 0;
return o2.weight - o1.weight;
}
}
ConcurrentSkipListSet<MyObject> list = new ConcurrentSkipListSet<MyObject>(new TaskComparator());
list.add(new MyObject(1, 1));
list.add(new MyObject(1, 2));
list.add(new MyObject(2, 1));
list.add(new MyObject(3, 1));
list.add(new MyObject(4, 1));
list.add(new MyObject(5, 1));
for(MyObject obj : list)
System.out.println(obj);
|
И вывод:
Ожидал:
|
|
|
|
 |
Jean : 1992 JavaTalks Team Member Откуда: Санкт-Петербург
|
Июн 04, 2011 0:02 |
|
|
Любопытно, почему у вас только два элемента в сете оказывается. А компаратор нужен только, чтобы отсортировать ваши значения. _________________ Всякое решение плодит новые проблемы |
|
|
|
 |
pjotar : 453 Бывалый Откуда: Санкт-Петербург
|
Июн 04, 2011 0:30 |
|
|
Вы, случайно, не путаете с java.util.Map.put? При добавлении в него старое значение заменяется добавляемым.
| Цитата: |
| If the map previously contained a mapping for this key, the old value is replaced by the specified value. |
А метод boolean add(E e) в java.util.Set не заменяет существующее и возвращает false.
| Цитата: |
| If this set already contains the element, the call leaves the set unchanged and returns false. |
|
|
|
|
 |
pjotar : 453 Бывалый Откуда: Санкт-Петербург
|
Июн 04, 2011 0:48 |
|
|
| Jean писал(а): |
| Любопытно, почему у вас только два элемента в сете оказывается. А компаратор нужен только, чтобы отсортировать ваши значения. |
Это из-за поведения согласно интерфейсу java.util.SortedSet<E>, который реализует ConcurrentSkipListSet. Поскольку одинаковые объекты не разрешены, и требуется чтобы компаратор возвращал 0 для equals объектов, SortedSet используют compareTo вместо equals. |
|
|
|
 |
pjotar : 453 Бывалый Откуда: Санкт-Петербург
|
Июн 04, 2011 1:21 |
|
|
| rage писал(а): |
| Нужна коллекция аналогичная ConcurrentSkipListSet но, что бы при добавлении равного объекта он заменял уже существующий. |
Когда мне нужны тонкости, я определяю собственный интерфейс, в реализации оборачивая и используя только явные свойства обернутого. Может это халтура от лени читать доку. А иначе нужно думать, что будет от того, что Comparator возвращает ноль для не equals объектов. |
|
|
|
 |
Jean : 1992 JavaTalks Team Member Откуда: Санкт-Петербург
|
Июн 04, 2011 1:41 |
|
|
| pjotar писал(а): |
| Jean писал(а): |
| Любопытно, почему у вас только два элемента в сете оказывается. А компаратор нужен только, чтобы отсортировать ваши значения. |
Это из-за поведения согласно интерфейсу java.util.SortedSet<E>, который реализует ConcurrentSkipListSet. Поскольку одинаковые объекты не разрешены, и требуется чтобы компаратор возвращал 0 для equals объектов, SortedSet используют compareTo вместо equals. |
Ааааа, блин, ведь верно =( закидайте меня камнями... _________________ Всякое решение плодит новые проблемы |
|
|
|
 |
rage : 27 Новичок
|
Июн 06, 2011 9:52 |
|
|
| Так все таки, что можно заюзать вместо ConcurrentSkipListSet? Или городить, что то свое? |
|
|
|
 |
Skipy : 4801 Я тут живу! Откуда: Москва, Россия
|
Июн 06, 2011 9:52 |
|
|
| rage писал(а): |
Не знаю как у вас, но у меня не заменяет если компаратор возвращает 0, то добавляемый объект отбрасывается, остается тот который был добавлен первым.
|
Вопрос на засыпку. Какая разница, какой из двух объектов остается, если они РАВНЫ???
P.S. А если есть разница - значит, они НЕ равны. _________________ С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других! |
|
|
|
 |
rage : 27 Новичок
|
Июн 06, 2011 11:05 |
|
|
| Skipy писал(а): |
| rage писал(а): |
Не знаю как у вас, но у меня не заменяет если компаратор возвращает 0, то добавляемый объект отбрасывается, остается тот который был добавлен первым.
|
Вопрос на засыпку. Какая разница, какой из двух объектов остается, если они РАВНЫ???
P.S. А если есть разница - значит, они НЕ равны. |
Они равны по весу, но могут нести в себе разные задачи которые по сути аналогичны, но должна выполнятся последняя добавленная. Условия задачи такие. |
|
|
|
 |
Skipy : 4801 Я тут живу! Откуда: Москва, Россия
|
Июн 06, 2011 11:48 |
|
|
Т.е. равенство определяется по весу? Тогда проще всего использовать Map с весом в качестве ключа. put работает именно так, как Вам надо. _________________ С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других! |
|
|
|
 |
rage : 27 Новичок
|
Июн 06, 2011 18:20 |
|
|
| map не подходит, так как нужно что бы заменялись только аналогичные таски с одинаковым весом, могут быть и не аналогичные таски с одинаковым весом. |
|
|
|
 |
Taky_ : 491 Бывалый
|
Июн 06, 2011 18:35 |
|
|
| Что значит не аналогичные? Компаратор считает только одно поле значимым... почему так? может все таки подняться на уровень выше и подробнее проблему описать? зачем надо такое поведение. |
|
|
|
 |
rage : 27 Новичок
|
Июн 06, 2011 18:49 |
|
|
| Пример лишь демонстрирует работу ConcurrentSkipListSet. В реальных условиях компаратор смотрит тип таска при одинаковом весе и в зависимости от типа таска возвращает значение. |
|
|
|
 |
|
|
|