Treesset поддерживает два метода сортировки: естественная сортировка и пользовательская сортировка. Treesset использует естественную сортировку по умолчанию.
1. Естественная сортировка
TreesSet будет называть метод CompareTo (Object OBJ) элемента сбора, чтобы сравнить размер взаимосвязи между элементами, а затем расположить элементы сбора в порядке восхождения. (Предварительное управление для сравнения: два объекта имеют одинаковый тип).
Java предоставляет сопоставимый интерфейс, который определяет метод CompareTo (Object Obj), который возвращает целочисленное значение. Когда объект вызывает метод для сравнения с другим объектом, например, obj1.comparto (obj2), если метод возвращает 0, это означает, что два объекта равны; obj2;
Общие классы Java реализуют сопоставимый интерфейс и обеспечивают стандарты сравнительных размеров. Общие классы, которые реализуют сопоставимый интерфейс:
Если вы попытаетесь добавить объект в деревья, класс объекта должен реализовать сопоставимый интерфейс.
В следующей программе сообщается об ошибке:
Class err {} public class testtreeseterror {public static void main (string [] args) {treeset ts = new Treeset (); добавить (new err ());иллюстрировать:
Приведенная выше программа пытается добавить 2 ER -объекта в коллекцию TreesSet. метод объекта) сравнивается с другими элементами в сборе - если соответствующий класс не реализует сопоставимый интерфейс, будет повышена ClassCastException. Более того, при попытке удалить первый элемент элемента из Treesset, исключение ClassCastException все еще будет поднято.
При сравнении объектов с использованием метода сравнения (Object OBJ) тип сравниваемого объекта OBJ должен быть поднят до одного и того же типа, потому что только два экземпляра одного класса могут сравнить размер. То есть объект, добавленный в Treesset, должен быть одного и того же класса, в противном случае будет повышена ClassCastException. Например, при добавлении строкового объекта в Treesset эта операция совершенно нормальная. При добавлении объекта второй даты Treeset будет вызвать метод Compareto (Object obj) объекта для сравнения с другими элементами в коллекции, и в настоящее время программа вызовет исключение.
В фактическом программировании программисты могут определить свои собственные классы для добавления нескольких типов объектов в TreesSet, при условии, что пользовательский класс реализует сопоставимый интерфейс. . Однако при использовании данных сбора в TreesSet исключения ClassCastExcteio все еще будут происходить для элементов разных типов. (Вы поймете после тщательного прочтения)
Когда объект добавляется в коллекцию деревьев, Treesset вызывает метод CompareTo (Object Obj) объекта, чтобы сравнить размер с другими объектами в контейнере, а затем определяет его расположение хранения на основе алгоритма красного и черного дерева. Если два объекта сравниваются в равной степени с помощью сравнения (объект obj), Treesset считает их хранить то же место.
Для коллекций деревьев критерий для определения того, что два объекта не равны: два объекта возвращают false через сравнение метода равных или сравнение сравнения (объект obj) не возвращает 0 - даже если два объекта являются одним и тем же объектом, Treeses также будет обрабатываться как два объекта.
В следующей программе показано:
// z -класс, переписывает метод Equals, всегда возвращает false, // метод сравнения (объект obj), всегда возвращает положительные целочисленные класса Z, сопоставимые {int age; } public boolean equals (Object obj) {return false; Z z1 = new z (6); SET); Видение также становится 9 System.out.println (((z) (set.last ()). Age);Результаты запуска программы:
истинный
[Reeset.z@1fb8ee3, reeset.z@1fb8ee3]
9
иллюстрировать:
Один и тот же объект дважды добавляется в программу, потому что метод Equals () объекта Z1 всегда возвращает FALSE, а метод сравнения (Object OBJ) всегда возвращает 1. Таким образом, Treesset будет думать, что объект Z1 отличается от себя, поэтому добавьте два объекта Z1 в деревья. Два элемента, сохраненные объектом Treesset, на самом деле являются одним и тем же элементом. Следовательно, после изменения возрастного атрибута первого элемента в коллекции деревьев, возрастной атрибут последнего элемента в коллекции деревьев также меняется.
Резюме : когда вам нужно поместить объект в Treeset и переписать метод equals () соответствующего класса объекта, вы должны убедиться, что метод имеет последовательные результаты с методом сравнения (объект obj). Два объекта проходят, когда сравнение метода Equals возвращает true, два объекта должны возвращать 0, сравнивая метод сравнения (объект obj).
Если два объекта сравниваются методом equals, но эти два объекта сравниваются методом CompareTo (Object obj) и не возвращают 0, это приведет к тому, что TreesSet сохраняет два объекта в разных местах, чтобы оба объекта могли быть успешно добавленным, что немного отличается от правил сборов сборов.
Если два объекта возвращают 0, сравнив метод сравнения (Object obj), но они возвращают false, сравнивая метод Equals: поскольку два объекта в равной степени сравниваются с сравнением метода сравнения (Object obj), TreesSet попытается сохранить их в То же место, но на самом деле это не работает (в противном случае останется только один объект), поэтому с ним более трудно справиться.
Если изменяющийся объект добавляется к деревьям, а последующая программа изменяет свойства изменяемого объекта, заставляя его изменить порядок размера с другими объектами, но деревья не скорректирует свой порядок и может даже вызвать его В The Treeset эти два объекта они возвращают True, сравнивая метод Equals, а метод сравнения (Object obj) возвращает 0.
В следующей программе показано:
Класс r {int count; if (obj exantef r) {r r = (r) obj; Class Testhashset2 {public void main (string [] args) {hashset hs = new hashset (); R (9); .iterator (); в None Sequential System.out.println (HS); -3 R объект? 5));Результаты запуска программы:
[R (Count Attruitte: -3), R (Count Attruitte: -2), R (Count Attruitte: 5), R (Count Attruitte: 9)]]
[R (Count Attruitte: 20), R (Count Attruitte: -2), R (Count Attruitte: 5), R (Count attribute: -2)]
[R (Count Attruitte: 20), R (Count Attruitte: -2), R (Count Attruitte: 5), R (Count attribute: -2)]
[R (Count Attruitte: 20), R (Count Attruitte: -2), R (Count Attruitte: -2)]
иллюстрировать:
Объект R в вышеуказанной программе является нормальным переписыванием метода Equals и сопоставимого метода. Вы можете видеть, что первый вывод программы упорядочен. Когда свойство подсчета объекта r изменяется, результат вывода программы также меняется и содержит дубликаты элементов. Как только свойства переменных элементов в коллекции деревьев изменяются, когда объект удален с целью, Treesset не будет удалена (даже элементы, которые оригинальны в коллекции, не были изменены, но элементы, которые равны модифицированным Элементы не могут быть удалены).
Когда r объект с -2 не удаляются, программа может удалить объект R с подсчетом 5, что указывает на то, что TreesSet может удалять объекты, которые не имеют измененных атрибутов и не повторяются с другими модифицированными атрибутами.
Резюме: с хэшсом он будет очень сложным и подверженным ошибкам при работе с этими объектами. Чтобы сделать программу более надежной, рекомендуется размещать только неизменные объекты в коллекции хэшса и деревьев.
2. Пользовательская сортировка
Естественный вид деревьев основан на размере элементов коллекции, а Treesset располагает их в порядке возрастания. Если вам нужно реализовать пользовательскую сортировку, например, порядок нисходящего, вы можете использовать интерфейс компаратора. Этот интерфейс содержит метод int сравнения (T O1, T O2), который используется для сравнения размеров O1 и O2.
Если вам необходимо реализовать индивидуальную сортировку, вам необходимо предоставить объект компаратора при создании объекта сбора TreesSet и предоставить объект компаратора для ассоциации с коллекцией TreesSet, а объект компаратора отвечает за логику сортировки элементов сбора.
В следующей программе показано:
класс m {int age; main (string [] args) {treaSet ts = new Treeset (new Comparator () {public int compare (Object O1, Object O2) {M M1 = (M) O1; M M2 = (M) O2; if (m1. age> m2.age) {return -1; Ts.Add (New M (-3);Результаты запуска программы:
[M объект (возраст: 9), M объект (возраст: 5), M объект (возраст: -3)]
иллюстрировать:
Приведенная выше программа создает анонимный внутренний класс объект интерфейса компаратора, который отвечает за сортировку коллекции TS. Поэтому, когда мы добавляем M -объекты в коллекцию TS, в классе M нет необходимости реализовать сопоставимый интерфейс, потому что в настоящее время Treesset не нужно сравнивать размер через объекты M, но объект компаратора, связанный с TreesSet отвечает за сортировку элементов коллекции. При использовании пользовательской сортировки Treesset сортирует элементы сбора независимо от размера самого элемента сбора, но объект компаратора отвечает за правила сортировки элементов коллекции.