如何在Java中使用 TreeSet 对自定义类对象的 LinkedHashSet 进行排序?
LinkedHashSet 是 HashSet 的有序版本,它在Java.util 包中存在的所有元素之间维护一个双向链表。当需要维护迭代顺序时,使用该类。
例子
Input : Student = {{"c",2},{"b",1},{"a",3}}
Output:
Sort by name = {{"a",3},{"b",1},{"c",2}}
Sort by rollNo = {{"b",1},{"c",2},{"a",3}}
方法一:
在示例中,没有使用自定义类,而是使用了Java的包装类,如 Integer、Double、Float 等,使用 TreeSet 对 LinkedHashSet 进行排序。为此,将 LinkedHashSet 元素转换为 TreeSet 并可以通过三种不同的方式执行此操作:-
- 通过使用 TreeSet 的构造函数。
- 通过使用 for 循环和 add() 方法。
- 通过使用 addAll() 方法。
执行:
Java
// Java Program to sort LinkedHashSet of custom
// class objects using TreeSet
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.TreeSet;
public class GFG {
public static void main(String[] args)
{
// creating a LinkedHashSet
LinkedHashSet lset0 = new LinkedHashSet<>();
// adding elements to LinkedHashSet
lset0.add(1.009);
lset0.add(1.10);
lset0.add(1.01);
lset0.add(1.019);
// creating a TreeSet
// and adding LinkedHashSet element to TreeSet
// using the constructor of the TreeSet
TreeSet tset0 = new TreeSet<>(lset0);
// Displaying the output
System.out.println("Sorted Set(ascending): "
+ tset0);
// creating a LinkedHashSet
LinkedHashSet lset1
= new LinkedHashSet<>();
// adding elements to LinkedHashSet
lset1.add(10);
lset1.add(7);
lset1.add(2);
lset1.add(20);
// creating TreeSet
TreeSet tset1 = new TreeSet<>();
// adding LinkedHashSet element to TreeSet
// using for loop and add() method
for (Integer i : lset1)
tset1.add(i);
// Displaying the output
System.out.println("Sorted Set(ascending): "
+ tset1);
// creating LinkedHashSet
LinkedHashSet lset2
= new LinkedHashSet<>();
// adding elements to the LinkedHashSet
lset2.add('s');
lset2.add('h');
lset2.add('i');
lset2.add('n');
// creating a TreeSet
TreeSet tset2 = new TreeSet<>();
// adding LinkedHashSet element to TreeSet
// element using addAll() method
tset2.addAll(lset2);
System.out.println("Sorted Set(ascending): "
+ tset2);
// creating a LinkedHashSet
LinkedHashSet lset3 = new LinkedHashSet<>();
// adding elements to the
// LinkedHashSet
lset3.add("Sandra");
lset3.add("Shishya");
lset3.add("Sarthak");
lset3.add("Sarah");
lset3.add("Sagar");
lset3.add("Sashi");
lset3.add("Sonika");
// creating a TreeSet but this time it will
// sort it in descending order
// so for sorting in descending order
// we will use Collections.reverseOrder() in
// the constructor of TreeSet
TreeSet tset3
= new TreeSet<>(Collections.reverseOrder());
// adding elements of LinkedHashSet to treeSet
// using addAll() method
tset3.addAll(lset3);
// Displaying output
System.out.println("Sorted Set(descending): "
+ tset3);
}
}
Java
Java Program to sort LinkedHashSet of custom
// class objects using TreeSet
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.TreeSet;
class friendsMarks {
// class field
String name;
String nickName;
int marks;
// parameterised constructor
public friendsMarks(String name, String nickName,
int marks)
{
this.name = name;
this.nickName = nickName;
this.marks = marks;
}
// getter for name
public String getName() { return name; }
// setter for name
public void setName(String name) { this.name = name; }
// getter for marks
public int getMarks() { return marks; }
// setter for marks
public void setMarks(int marks) { this.marks = marks; }
// getter for nickname
public String getNickName() { return nickName; }
// setter for nickname
public void setNickName(String nickName)
{
this.nickName = nickName;
}
//@Override toString method
public String toString()
{
return "friendsMarks{"
+ "name='" + name + '\'' + ", nickName='"
+ nickName + '\'' + ", marks=" + marks + '}';
}
}
// for comparing names
class nameCompare implements Comparator {
@Override
public int compare(friendsMarks friend1,
friendsMarks friend2)
{
return friend1.getName().compareTo(
friend2.getName());
}
}
// for comparing nick name
class nickNameCompare implements Comparator {
@Override
public int compare(friendsMarks obj1, friendsMarks obj2)
{
return obj1.getNickName().compareTo(
obj2.getNickName());
}
}
// for comparing marks
class marksCompare implements Comparator {
@Override
public int compare(friendsMarks f1, friendsMarks f2)
{
if (f1.getMarks() > f2.getMarks()) {
return 1;
}
else {
return -1;
}
}
}
public class Main {
public static void main(String[] args)
{
// Creating LinkedHashSet
LinkedHashSet linkedHashSet
= new LinkedHashSet<>();
// adding elements to LinkedHashSet
linkedHashSet.add(
new friendsMarks("Raushan", "Chamgader", 99));
linkedHashSet.add(
new friendsMarks("Yashdeep", "Dopa", 95));
linkedHashSet.add(
new friendsMarks("Rupesh", "Gian", 92));
linkedHashSet.add(
new friendsMarks("Shishya", "Gorilla", 47));
linkedHashSet.add(
new friendsMarks("Sarthak", "Nagin", 78));
linkedHashSet.add(
new friendsMarks("Sonika", "Chipkali", 67));
linkedHashSet.add(
new friendsMarks("Himanshu", "Lalten", 57));
// Creating TreeSet
// and we have to pass Comparator object
// of marksCompare class
// in the TreeSet constructor
// so that we can sort according to the marks
TreeSet treeSet0
= new TreeSet<>(new marksCompare());
// storing elements of LinkedHashSet
// into TreeSet by using method addAll()
treeSet0.addAll(linkedHashSet);
System.out.println("Sorting on the basis of marks");
// Displaying using loop
for (friendsMarks tree : treeSet0)
System.out.println(tree);
// Creating TreeSet
// and we have to pass Comparator object
// of nameCompare class
// in the TreeSet constructor
// so that we can sort according to the name
TreeSet treeSet1
= new TreeSet<>(new nameCompare());
// storing elements of LinkedHashSet
// into TreeSet by using method addAll()
treeSet1.addAll(linkedHashSet);
// Displaying using loop
System.out.println(
"\n\nSorting on the basis of name");
for (friendsMarks tree : treeSet1)
System.out.println(tree);
// Creating TreeSet
// and we have to pass Comparator object
// of nickNameCompare class
// in the TreeSet constructor
// so that we can sort according to the nickname
TreeSet treeSet2
= new TreeSet<>(new nickNameCompare());
// storing elements of LinkedHashSet
// into TreeSet by using method addAll()
treeSet2.addAll(linkedHashSet);
// Displaying using loop
System.out.println(
"\n\nSorting on the basis of nick-name");
for (friendsMarks tree : treeSet2)
System.out.println(tree);
}
}
输出
Sorted Set(ascending): [1.009, 1.01, 1.019, 1.1]
Sorted Set(ascending): [2, 7, 10, 20]
Sorted Set(ascending): [h, i, n, s]
Sorted Set(descending): [Sonika, Shishya, Sashi, Sarthak, Sarah, Sandra, Sagar]
方法二:
这里使用了 Comparator 接口。比较器接口用于对用户定义的类的对象进行排序。比较器对象能够比较两个不同类的两个对象。
执行:
Java
Java Program to sort LinkedHashSet of custom
// class objects using TreeSet
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.TreeSet;
class friendsMarks {
// class field
String name;
String nickName;
int marks;
// parameterised constructor
public friendsMarks(String name, String nickName,
int marks)
{
this.name = name;
this.nickName = nickName;
this.marks = marks;
}
// getter for name
public String getName() { return name; }
// setter for name
public void setName(String name) { this.name = name; }
// getter for marks
public int getMarks() { return marks; }
// setter for marks
public void setMarks(int marks) { this.marks = marks; }
// getter for nickname
public String getNickName() { return nickName; }
// setter for nickname
public void setNickName(String nickName)
{
this.nickName = nickName;
}
//@Override toString method
public String toString()
{
return "friendsMarks{"
+ "name='" + name + '\'' + ", nickName='"
+ nickName + '\'' + ", marks=" + marks + '}';
}
}
// for comparing names
class nameCompare implements Comparator {
@Override
public int compare(friendsMarks friend1,
friendsMarks friend2)
{
return friend1.getName().compareTo(
friend2.getName());
}
}
// for comparing nick name
class nickNameCompare implements Comparator {
@Override
public int compare(friendsMarks obj1, friendsMarks obj2)
{
return obj1.getNickName().compareTo(
obj2.getNickName());
}
}
// for comparing marks
class marksCompare implements Comparator {
@Override
public int compare(friendsMarks f1, friendsMarks f2)
{
if (f1.getMarks() > f2.getMarks()) {
return 1;
}
else {
return -1;
}
}
}
public class Main {
public static void main(String[] args)
{
// Creating LinkedHashSet
LinkedHashSet linkedHashSet
= new LinkedHashSet<>();
// adding elements to LinkedHashSet
linkedHashSet.add(
new friendsMarks("Raushan", "Chamgader", 99));
linkedHashSet.add(
new friendsMarks("Yashdeep", "Dopa", 95));
linkedHashSet.add(
new friendsMarks("Rupesh", "Gian", 92));
linkedHashSet.add(
new friendsMarks("Shishya", "Gorilla", 47));
linkedHashSet.add(
new friendsMarks("Sarthak", "Nagin", 78));
linkedHashSet.add(
new friendsMarks("Sonika", "Chipkali", 67));
linkedHashSet.add(
new friendsMarks("Himanshu", "Lalten", 57));
// Creating TreeSet
// and we have to pass Comparator object
// of marksCompare class
// in the TreeSet constructor
// so that we can sort according to the marks
TreeSet treeSet0
= new TreeSet<>(new marksCompare());
// storing elements of LinkedHashSet
// into TreeSet by using method addAll()
treeSet0.addAll(linkedHashSet);
System.out.println("Sorting on the basis of marks");
// Displaying using loop
for (friendsMarks tree : treeSet0)
System.out.println(tree);
// Creating TreeSet
// and we have to pass Comparator object
// of nameCompare class
// in the TreeSet constructor
// so that we can sort according to the name
TreeSet treeSet1
= new TreeSet<>(new nameCompare());
// storing elements of LinkedHashSet
// into TreeSet by using method addAll()
treeSet1.addAll(linkedHashSet);
// Displaying using loop
System.out.println(
"\n\nSorting on the basis of name");
for (friendsMarks tree : treeSet1)
System.out.println(tree);
// Creating TreeSet
// and we have to pass Comparator object
// of nickNameCompare class
// in the TreeSet constructor
// so that we can sort according to the nickname
TreeSet treeSet2
= new TreeSet<>(new nickNameCompare());
// storing elements of LinkedHashSet
// into TreeSet by using method addAll()
treeSet2.addAll(linkedHashSet);
// Displaying using loop
System.out.println(
"\n\nSorting on the basis of nick-name");
for (friendsMarks tree : treeSet2)
System.out.println(tree);
}
}
输出
Sorting on the basis of marks
friendsMarks{name='Shishya', nickName='Gorilla', marks=47}
friendsMarks{name='Himanshu', nickName='Lalten', marks=57}
friendsMarks{name='Sonika', nickName='Chipkali', marks=67}
friendsMarks{name='Sarthak', nickName='Nagin', marks=78}
friendsMarks{name='Rupesh', nickName='Gian', marks=92}
friendsMarks{name='Yashdeep', nickName='Dopa', marks=95}
friendsMarks{name='Raushan', nickName='Chamgader', marks=99}
Sorting on the basis of name
friendsMarks{name='Himanshu', nickName='Lalten', marks=57}
friendsMarks{name='Raushan', nickName='Chamgader', marks=99}
friendsMarks{name='Rupesh', nickName='Gian', marks=92}
friendsMarks{name='Sarthak', nickName='Nagin', marks=78}
friendsMarks{name='Shishya', nickName='Gorilla', marks=47}
friendsMarks{name='Sonika', nickName='Chipkali', marks=67}
friendsMarks{name='Yashdeep', nickName='Dopa', marks=95}
Sorting on the basis of nick-name
friendsMarks{name='Raushan', nickName='Chamgader', marks=99}
friendsMarks{name='Sonika', nickName='Chipkali', marks=67}
friendsMarks{name='Yashdeep', nickName='Dopa', marks=95}
friendsMarks{name='Rupesh', nickName='Gian', marks=92}
friendsMarks{name='Shishya', nickName='Gorilla', marks=47}
friendsMarks{name='Himanshu', nickName='Lalten', marks=57}
friendsMarks{name='Sarthak', nickName='Nagin', marks=78}