如何在Java中使用用户定义的对象对 TreeSet 进行排序?
比较器接口对用户定义的类的对象进行排序。 Comparator类的对象能够比较两个不同类的两个对象。以下函数将obj1与obj2进行比较
- TreeSet实现了SortedSet接口。因此,不允许重复值。
- TreeSet 中的对象按排序和升序存储。
- TreeSet不保留元素的插入顺序,而是按键对元素进行排序。
- 如果我们依赖于默认的自然排序顺序,那么被插入到树中的对象应该是同类的和可比较的。 TreeSet不允许插入异构对象。它会抛出一个classCastException
由于TreeSet实现了sortedSet接口,因此默认情况下元素按升序排序。但是,如果我们想在排序中进行更改,例如按降序排列或根据姓名、分数、薪水(这些都是用户定义的类)进行排序,就像以任何方式一样。
因此,我们可以通过显式实现比较器类来解决所有这些问题。
句法:
public int compare(Object obj1, Object obj2):
方法 :
- 比较器接口用于对用户定义类的对象进行排序。
- 该接口存在于Java.util 包中,包含 2 个方法compare (Object obj1、Object obj2)和equals (Object 元素)。
- 使用比较器,我们可以根据数据成员对元素进行排序。例如,它可能在标记、名称或其他任何东西上。
用于对 List 元素进行排序的 Collections 类的方法用于通过给定的比较器对 List 的元素进行排序。
// To sort a given list. ComparatorClass must implement
// Comparator interface.
public void sort(List list, ComparatorClass c)
例子:
Java
// Java program to Sort a TreeSet with
// User Defined Objects
import java.io.*;
import java.util.*;
class students{
private int marks;
private String name;
// constructor
public students(int value, String name)
{
this.marks=value;
this.name=name;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name= name;
}
public int getMarks()
{
return marks;
}
}
// Comparator class will override the compare
// method which will compare the tw objects
// passed in the parameter
class myMarksComparator implements Comparator
{
public int compare(students s1, students s2)
{
return s1.getMarks()-s2.getMarks();
}
}
class myNameComparator implements Comparator
{
public int compare(students s1, students s2)
{
return s1.getName().compareTo(s2.getName());
}
}
class GFG {
public static void main (String[] args){
// Creating the TreeSet with Comparator object passed
// as the parameter which will sort the user defined
// objects of TreeSet
TreeSet set = new TreeSet(new myMarksComparator());
set.add(new students(450,"Sam"));
set.add(new students(341,"Ronaldo"));
set.add(new students(134,"Daniel"));
set.add(new students(590,"George"));
System.out.println("increasing Order with the Marks");
// Printing the TreeSet elements
for(students ele: set)
{
System.out.print(ele.getName()+" "+ele.getMarks());
System.out.println();
}
TreeSet mrks= new TreeSet(new myNameComparator());
mrks.add(new students(450,"Sam"));
mrks.add(new students(341,"Ronaldo"));
mrks.add(new students(134,"Daniel"));
mrks.add(new students(590,"George"));
System.out.println();
for(students ele : mrks)
{
System.out.print(ele.getName() +" "+ ele.getMarks());
System.out.println();
}
}
}
输出
-------increasing Order with the Marks
Daniel 134
Ronaldo 341
Sam 450
George 590
Daniel 134
George 590
Ronaldo 341
Sam 450