быть в спящем режиме сохранение упорядочивания Списка OneToMany, но инвертирование?

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)
6
задан Linger 4 September 2012 в 18:27
поделиться

5 ответов

Реализовали ли вы compareTo в этой иерархии объектов?

0
ответ дан 10 December 2019 в 00:44
поделиться

Использует ли ваш слой Hibernate наборы? Я считаю, что это происходит по умолчанию. Установленный интерфейс (и его конкретные реализации) не поддерживают порядок вставки.

В качестве альтернативы вы можете посмотреть свои запросы, используете ли вы «порядок по»?

Я бы хотел также пытаюсь просмотреть коллекцию в памяти с помощью отладчика. Возможно, ваш код просмотра переупорядочивает коллекцию. По крайней мере, отладчик будет полезен, чтобы увидеть, в какой именно момент происходит обратное изменение вашей коллекции.

2
ответ дан 10 December 2019 в 00:44
поделиться

Я думаю, что нет способа добиться этого напрямую с помощью списков . В работе мы используем следующее:

Если вы хотите предоставить своему пользователю полный контроль над порядком сущностей, вам следует добавить новое поле, например:

@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);

и сохраните задачи. И наслаждайтесь полным контролем.

2
ответ дан 10 December 2019 в 00:44
поделиться

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>();
4
ответ дан 10 December 2019 в 00:44
поделиться

Вы работаете непосредственно со списком?

object.getItems().add/remove/set ...

Попробуйте вместо этого сделать копию

List items = new ArrayList(object.getItems());

, затем работайте с ней, а затем установите полную коллекцию за один раз:

object.setItems(items)
0
ответ дан 10 December 2019 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: