目录
一、set的特性
Set是个无序、不可重复的集合接口;有三个实现类: HashSet、TreeSet、LinkedHashSet;
Set的特性是有序不重复,Jdk中使用了HashMap的Key作为Set的容器。
二、包装类型set的排序方式
1.方法一:新建TreeSet
Set<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("5");
set.add("4");
set.add("3");
System.out.println(set.toString());
Set<String> sortSet = new TreeSet<String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// 降序排列 (升序是将o1与o2交换下位置)
return o2.compareTo(o1);
}
});
sortSet.addAll(set);
System.out.println(sortSet.toString());
2.方法二:新建TreeSet的同时,用lambda表达式排序
Set<String> set = new HashSet<>();
set.add("2");
set.add("1");
set.add("5");
set.add("3");
set.add("4");
System.out.println(set.toString());
Set<String> sortSet = new TreeSet<String>((o1, o2) -> o2.compareTo(o1));
sortSet.addAll(set);
System.out.println(sortSet.toString());
3.方法三:JDK API
Set<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
set.add("5");
set.add("4");
System.out.println(set.toString());
Set<String> sortSet = new TreeSet<String>(Comparator.reverseOrder());
sortSet.addAll(set);
System.out.println(sortSet.toString());
4.方法四:Java8 stream 流
Set<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
set.add("4");
set.add("5");
System.out.println(set.toString());
//这里后续用有序的list处理即可,因为流中进行了倒序处理,收集成set后会重排
List<String> collect = set.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
System.out.println(collect);
三、自定义类型set排序
现有set集合如下:
public class UserInfo{
private int id;
private String userName;
private Integer age;
private String userCode;
}
@Test
public void test(){
UserInfo user1 = new UserInfo();
user1.id = 1;
user1.userName = "hoshi";
user1.age = 27;
UserInfo user2 = new UserInfo();
user2.id = 2;
user2.userName = "dk";
user2.age = 26;
UserInfo user3 = new UserInfo();
user3.id = 3;
user3.userName = "SEUNGKWAN";
user3.age = 25;
UserInfo user4 = new UserInfo();
user4.id = 4;
user4.userName = "dino";
user4.age = 24;
Set<UserInfo> userSet = new HashSet() { // 这个括号用来创建匿名内部类
{ // 这个括号表示是匿名内部类的实例初始化块
add(user1);
add(user2);
add(user3);
add(user4);
}
};
for(UserInfo user : userSet){
System.out.println("id: "+user.id + ", \tuserName: "+user.userName + ", \t age: " + user.age);
}
}
1.方法一:TreeSet
Set<UserInfo> sortSet = new TreeSet<UserInfo>((o1, o2) -> o2.age.compareTo(o1.age));
sortSet.addAll(userSet);
for(UserInfo user : sortSet){
System.out.println("id: "+user.id + ", \tuserName: "+user.userName + ", \t age: " + user.age);
}
2.通过Java8 stream 流 排序。
List<UserInfo> collect = userSet.stream().sorted(Comparator.comparing(p -> p.age)).collect(Collectors.toList());
System.out.println("\n按age从小到大排序后:");
for(UserInfo user : collect){
System.out.println("id: "+user.id + ", \tuserName: "+user.userName + ", \t age: " + user.age);
}
“冒泡 咕噜咕噜”
o(〃'▽'〃)o