import itertools
lst = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']
w = 'WORD'
spl = [list(y) for x, y in itertools.groupby(lst, lambda z: z == w) if not x]
это создает разделенный список без разделителей, что выглядит более логичным для меня:
[['A'], ['B', 'C'], ['D']]
Если вы настаиваете на включении разделителей, это должно сработать:
spl = [[]]
for x, y in itertools.groupby(lst, lambda z: z == w):
if x: spl.append([])
spl[-1].extend(y)
Реализовали ли вы compareTo в этой иерархии объектов?
Использует ли ваш слой Hibernate наборы? Я считаю, что это происходит по умолчанию. Установленный интерфейс (и его конкретные реализации) не поддерживают порядок вставки.
В качестве альтернативы вы можете посмотреть свои запросы, используете ли вы «порядок по»?
Я бы хотел также пытаюсь просмотреть коллекцию в памяти с помощью отладчика. Возможно, ваш код просмотра переупорядочивает коллекцию. По крайней мере, отладчик будет полезен, чтобы увидеть, в какой именно момент происходит обратное изменение вашей коллекции.
Я думаю, что нет способа добиться этого напрямую с помощью списков . В работе мы используем следующее:
Если вы хотите предоставить своему пользователю полный контроль над порядком сущностей, вам следует добавить новое поле, например:
@Entity
public class Todo {
@Id private Long id;
private int position;
// + public setter/getter
}
@Entity
public class Todos {
@Id private id;
@OneToMany
private List<Todo> todos = new LinkedList<Todo>();
// + public setter/getter
}
, а затем поместить порядок по позиции во всех запросах или реализовать Comparator для Todos и используйте Collections.sort (List lst, Comparator cmp), чтобы отсортировать список в памяти.
public class TodoComparator implements Comparator {
public int compare(Object o1, Object o2) {
Todo t1 = (Todo)o1;
Todo t2 = (Todo)o2;
return t2.getPosition() - t1.getPosition();
}
}
Collection.sort (todos, new TodosComparator ());
после того, как ваш пользователь закончит переупорядочить список, (перед сохранением) измените нумерацию списка:
for(int pos=0; pos < todos.size(); pos++ )
todos.get(pos).setPosition(pos);
и сохраните задачи. И наслаждайтесь полным контролем.
Hibernate поддерживает упорядоченные элементы с помощью аннотации IndexColumn.
Вот пример из книги «Сохранение Java с гибернацией» :
@org.hibernate.annotations.CollectionOfElements
@JoinTable(
name = "ITEM_IMAGE",
joinColumns = @JoinColumn(name = "ITEM_ID")
)
@org.hibernate.annotations.IndexColumn(
name="POSITION", base = 1
)
@Column(name = "FILENAME")
private List<String> images = new ArrayList<String>();
Вы работаете непосредственно со списком?
object.getItems().add/remove/set ...
Попробуйте вместо этого сделать копию
List items = new ArrayList(object.getItems());
, затем работайте с ней, а затем установите полную коллекцию за один раз:
object.setItems(items)