Во-первых, вам нужно понять, почему в первую очередь стоит реализовать equals
. Когда вы проводите сравнение примитивных типов, таких как целые числа, становится совершенно очевидно, как они сравниваются. Java не нуждается в какой-либо помощи, чтобы сказать, 1==1
Но для класса, который вы создаете сами, как Student
, Java не знает, что означает равенство. Единственное, что он может проверить самостоятельно - это ссылочное равенство ; то есть, указывают ли две переменные на один и тот же объект в памяти. Однако обычно это бесполезно, поэтому вместо этого мы должны написать собственный метод и определить, когда два объекта равны, проверяя внутренние детали каждого из них. (Если вы уже все это знали, извините, но с таким же успехом можете быть внимательны)
Похоже, что ваш класс Student
определил равенство как истинное, когда два Student
объекта имеют одно и то же regNumber
. [ 1122]
Давайте рассмотрим, что он делает, шаг за шагом:
if (this == obj)
return true;
this
ссылается на ссылку на текущий экземпляр объекта Student
, вызывающего этот метод . Другими словами, это не что иное, как указатель на объект. Таким образом, оператор if выполняет проверку, которая гласит: «Если эта ссылка на объект и ссылка на объект переданы в точке одному и тому же объекту, верните true». По сути, это избавляет нас от необходимости сравнивать какие-либо их внутренние детали, потому что, если два объекта проходят ссылочное равенство, они должны быть равны.
if (obj == null)
return false;
Довольно понятно. Если переданная ссылка на другой объект является нулевой, она не может быть равна этому объекту, поэтому верните false.
if (getClass() != obj.getClass())
return false;
Эта строка выполняет сравнение на основе типов классов. Таким образом, если этот объект (a Student
) не относится к тому же типу класса, что и переданный объект, снова они не могут быть равны, поэтому возвращают false.
Student other = (Student) obj;
if (regNumber == null) {
if (other.regNumber != null)
return false;
} else if (!regNumber.equals(other.regNumber))
return false;
return true;
Теперь для настоящего мяса сравнения. Сначала мы приводим переданный Object
обратно в тип Student
. Затем сравните regNumber
каждого объекта (сначала подтвердите, что ни один из них не является null
, чтобы избежать NullPointerException
. Если они не равны, мы возвращаем false, в противном случае возвращаем true.
Обратите внимание, что если вы если добавить дополнительные поля в Student
, они будут проигнорированы в том, что касается равенства, если только вы не добавите способ учесть их в своем методе equals
. То есть поля не «автоматически повторяются через ", вы должны вручную и намеренно добавить все поля, которые должны считаться релевантными для равенства объектов.
Самый легкий путь вокруг этого состоял бы в том, чтобы просто использовать BindingList как так:
private List<string> mAllianceList = new List<string>();
private BindingList<string> bindingList;
private void FillAllianceList()
{
// Add alliance name to member alliance list
foreach (Village alliance in alliances)
{
mAllianceList.Add(alliance.AllianceName);
}
bindingList = new BindingList<string>(mAllianceList);
// Bind alliance combobox to alliance list
this.cboAlliances.DataSource = bindingList;
}
Затем отсюда на, просто имейте дело с обязательным списком, чтобы добавить и удалить объекты оттуда. Это удалит его и из Списка и из ComboBox.
Править: Для ответа на вопрос относительно сортировки я предполагаю самое легкое (но возможно "hacky" способ сделать это было бы что-то вроде этого:
mAllianceList.Sort();
bindingList = new BindingList<string>(mAllianceList);
this.cboAlliances.DataSource = bindingList;
Так в основном после сортировки Вы создаете новый обязательный список и сбрасываете источник данных. Возможно, существует более изящный способ пойти об этом, однако это должно работать.