Java: сортировка неизменяемого списка

Чтобы достичь того, что вы хотите, вам нужно предоставить некоторую дополнительную конфигурацию. Код Первое соглашение может идентифицировать двунаправленные отношения, но не тогда, когда есть несколько двунаправленных отношений между двумя объектами. Вы можете добавить конфигурацию (используя аннотации данных или Fluent API) в представить эту информацию разработчику модели. С аннотациями данных вы будете использовать аннотацию под названием InverseProperty . С API Fluent вы будете использовать комбинацию методов Has / With, чтобы указать правильные концы этих отношений.

Использование аннотаций данных может быть таким:

public class Student
{
  public int ID { get; set; }

  public string Name { get; set; }

  public string Surname { get; set; }

  public int BirthCityID { get; set; }

  public int LivingCityID { get; set; }


  [ForeignKey("BirthCityID")]
  [InverseProperty("Students")]
  public virtual City BirthCity { get; set; }

  [ForeignKey("LivingCityID")]
  public virtual City LivingCity { get; set; }
}

Таким образом вы явно указываете, что хотите связать свойство навигации BirthCity с навигационным свойством Students в другом конце отношения.

Использование Fluent Api может быть таким:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     modelBuilder.Entity().HasRequired(m => m.BirthCity)
                                 .WithMany(m => m.Students).HasForeignKey(m=>m.BirthCityId);
     modelBuilder.Entity().HasRequired(m => m.LivingCity)
                                 .WithMany().HasForeignKey(m=>m.LivingCityId);
}

С помощью этого последнего решения вам не нужно использовать какой-либо аттрибут.

Теперь предложение @ChristPratt in имеет коллекцию Student в вашем City класс для каждой взаимосвязи действительно полезен. Если вы это сделаете, то конфигурации с использованием аннотаций данных могут быть такими:

public class Student
{
  public int ID { get; set; }

  public string Name { get; set; }

  public string Surname { get; set; }

  public int BirthCityID { get; set; }

  public int LivingCityID { get; set; }


  [ForeignKey("BirthCityID")]
  [InverseProperty("BirthCityStudents")]
  public virtual City BirthCity { get; set; }

  [ForeignKey("LivingCityID")]
  [InverseProperty("LivingCityStudents")]
  public virtual City LivingCity { get; set; }
}

Или используя Fluent Api, следуя той же идее:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     modelBuilder.Entity().HasRequired(m => m.BirthCity)
               .WithMany(m => m.BirthCityStudents).HasForeignKey(m=>m.BirthCityId);
     modelBuilder.Entity().HasRequired(m => m.LivingCity)
               .WithMany(m => m.LivingCityStudents).HasForeignKey(m=>m.LivingCityId);
}

20
задан Bozho 15 December 2010 в 06:49
поделиться

5 ответов

Создаете ли вы пустой список с помощью Collections.emptyList () ? Если да, то это тоже немодифицируемый список, и он может быть источником вашей проблемы.

Создайте новый список, используя конструктор для вашей реализации List, например new ArrayList () . Вы можете передать исходный список в конструктор или использовать метод addAll () .

21
ответ дан 29 November 2019 в 22:25
поделиться

FWIW, с google-collections однострочным:

List<Foo> sorted = Ordering.natural().sortedCopy(unmodifiableList);
40
ответ дан 29 November 2019 в 22:25
поделиться
    List unmodifiableList = Collections.unmodifiableList(list);

    List newList = new ArrayList(unmodifiableList);

    Collections.sort(newList);

Конструктор ArrayList принимает существующий список,

37
ответ дан 29 November 2019 в 22:25
поделиться

Вы можете создавать свои собственные шаблоны. Действительно полезно, например, для внутренних стандартов структуры проекта.

Лучший способ начать создавать свой собственный - это начать с существующего примера и скопировать / вставить из него соответствующие фрагменты. Предложение: ZopeSkel , поскольку он довольно большой, с множеством примеров. Просмотрите исходный код .

Неизменяемый / неизменяемый список или коллекция любого типа не может быть напрямую изменен каким-либо образом - вы не можете добавлять в него элементы, удалять из него элементы или изменять ссылки на существующие элементы.

Обратите внимание, что существующие элементы в списке / коллекции могут можно изменить, если они сами являются изменяемыми, но ссылки на них из списка не могут быть изменены. То есть, пока список полностью не выйдет из области видимости и не будет собран сборщиком мусора, неизменяемый список всегда будет содержать те же самые ссылки.

Теперь, в вашем случае, Collections.emptyList () возвращает неизменяемый EMPTY список. На самом деле это всегда один и тот же экземпляр, поскольку он неизменяем и всегда пуст. Вы не можете добавить в него из-за правила, что неизменяемый список не может быть расширен (добавлен). Поскольку он пустой, в нем также нет ничего, что можно было бы изменить.

Я должен добавить, чтобы было еще яснее, что Collection.emptyList () не создает пустой список. Он просто возвращает ссылку на экземпляр одноэлементного списка.

0
ответ дан 29 November 2019 в 22:25
поделиться

Он должен работать, как описано. Элементы в неизменяемом Списке сами по себе не являются неизменяемыми. Конечно, вы не можете отсортировать немодифицируемый список, потому что он должен быть переписан с помощью операций добавления и удаления, а они не разрешены.

Думаю, ошибка где-то в другом месте, лучше всего показать свой код :)

0
ответ дан 29 November 2019 в 22:25
поделиться
Другие вопросы по тегам:

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