Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

аналог ConcurrentSkipListSet
Список форумов
 ->  Коллекции (Java Collection Framework)


На страницу 1, 2  След. 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
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);


И вывод:
Код:

1 2
1 1


Ожидал:
Код:

1 2
5 1
К началу Посмотреть профиль Отправить личное сообщение
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. В реальных условиях компаратор смотрит тип таска при одинаковом весе и в зависимости от типа таска возвращает значение.
К началу Посмотреть профиль Отправить личное сообщение
 
Начать новую тему  Ответить на тему
Страница 1 из 2
На страницу 1, 2  След.
Список форумов
 -> Коллекции (Java Collection Framework)


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru