Java基础之集合框架--Collections.reverseOrder()

本文介绍Java集合框架中TreeSet的高级用法,包括如何利用Collections.reverseOrder()方法实现元素的逆序排列,以及如何自定义比较器按照特定规则如字符串长度进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总结:先看一下集合框架工具类有没有提供对应的方法,如果没有再自己写一个方法

package newFeatures8;

import java.util.Collections;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

public class CollectionsDemo {

	public static void main(String[] args) {
		//reverseOrderDemo();
		reverseOrderAccordingByStrLenDemo();
	}
	
	/*在list集合中如果想要反转list集合中的元素可以使用
	 * Collections.reverse(list);但是reverse方法
	 * 只能操作list集合,如果我想对TreeSet进行反转,我又不想自己写反转的方法
         *jdk1.6以后提供了TreeSet.descendingSet()方法,该方法等同于Collections.reverseOrder()
	 * 该怎么办呢?可以自己写一个比较器,这个比较器倒着写就行了s2.compareTo(s1);
	 * 但是只为了反转就要写一个比较器有点麻烦,Java工程师们早就想到了这一点
	 * 提供了Collections.reverseOrder()方法,该方法返回一个强行逆转自然顺序比较器
	 * 专门为TreeSet或TreeMap而设计
	 * 这回比较器就不用自己写了
	 */
	public static void reverseOrderDemo(){
		//集合初始化时就可以传一个比较器
		Set<String> treeSet=new TreeSet<>(Collections.reverseOrder()/*new reverseCompartor()*/);
		treeSet.add("abcd");//String类本身就是实现了Comparable接口
		treeSet.add("kkkkk");
		treeSet.add("qq1");
		treeSet.add("z");
		treeSet.add("zz1");
		treeSet.add("zz");
		treeSet.add("qq1");
		treeSet.add("qq1");
		treeSet.add("qq2");
		
		System.out.println("原集合是:"+treeSet);
		//System.out.println("原集合是:"+treeSet);
		
	}
	/**
	 * @author ljh
	 * @description 根据指定比较器安照字符串的长度倒序排序
	 */
	public static void reverseOrderAccordingByStrLenDemo(){
		//集合初始化时就可以传一个比较器
		Set<String> treeSet=new TreeSet<>(Collections.reverseOrder(new strLenCompartor())/*new strLenCompartor()*/);
		treeSet.add("abcd");//String类本身就是实现了Comparable接口
		treeSet.add("kkkkk");
		treeSet.add("z");
		treeSet.add("zz1");
		treeSet.add("zz");
		treeSet.add("qq1");
		treeSet.add("qq2");
		
		System.out.println("原集合是:"+treeSet);
		//System.out.println("原集合是:"+treeSet);
		
	}
	
	/** 
     *  
     * @author ljh 
     * @description 静态内部类</br> 
     * 按照字符串的长度进行排序,如果字符串长度相同按按照名称排序 
     */  
    static class reverseCompartor implements Comparator<String>{  
        @Override  
        public int compare(String s1, String s2) {  
        	
               /* 方法一:
                int num= s1.compareTo(s2);  
                if(num>0)return -1;//本来应该返回1的,结果你反过来-1,结果就倒过来了
                else if(num<0)return 1;
              return num;
              */  
        	
        	 // 方法二:
              int num= s1.compareTo(s2);  
	          return (num>0)?-1:(num<0?1:0);
	          
        	
        	//方法三:注意与方法二的区别
        	/*return s2.compareTo(s1);//s1与s2反过来写,s2先写*/
        	
        	
        }  
    }  
	
	/** 
     *  
     * @author ljh 
     * @description 静态内部类</br> 
     * 按照字符串的长度进行排序,如果字符串长度相同按按照名称排序 
     */  
    static class strLenCompartor implements Comparator<String>{  
        @Override  
        public int compare(String s1, String s2) {  
             int num=new Integer(s1.length()).compareTo(new Integer(s2.length()));  
             //当主要条件相同一定要按照次要条件排序  
             if (num==0) {  
                return s1.compareTo(s2);  
            }  
            return num;  
        }  
    }  

}




### Java集合排序的实现方式 #### 使用 `Collections.sort()` 方法 `Collections.sort()` 是一种常见的用于对列表进行排序的方法。它可以直接应用于实现了 `Comparable` 接口的对象列表,按照自然顺序进行排序[^1]。 ```java import java.util.*; public class SortExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("b"); list.add("d"); list.add("ca"); list.add("da"); System.out.println("排序前:" + list); Collections.sort(list); // 自然顺序排序 System.out.println("排序后:" + list); } } ``` 对于复杂对象,可以通过传递一个自定义的 `Comparator` 来指定排序逻辑[^2]: ```java class Person implements Comparable<Person> { String name; int age; Person(String name, int age) { this.name = name; this.age = age; } @Override public int compareTo(Person other) { return Integer.compare(this.age, other.age); // 按年龄升序排列 } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } } public class CustomSortExample { public static void main(String[] args) { List<Person> people = new ArrayList<>(); people.add(new Person("Alice", 30)); people.add(new Person("Bob", 25)); System.out.println("排序前:" + people); // 使用内置 sort 和 Comparator 进行排序 Collections.sort(people, (p1, p2) -> p1.name.compareTo(p2.name)); System.out.println("按姓名排序后:" + people); } } ``` #### 使用 `List.sort()` 方法 从 Java 8 开始,`List` 接口中引入了 `sort()` 方法,其功能与 `Collections.sort()` 类似,但更简洁。 ```java people.sort((p1, p2) -> p1.name.compareTo(p2.name)); // Lambda 表达式简化 ``` #### 使用 Stream API 的排序 Java 8 提供了流式操作(Stream API),可以方便地对集合数据进行过滤、映射和排序等操作。然而,在某些场景下需要注意潜在问题,比如当结合分页插件 PageHelper 时可能导致分页失效[^3]。 ```java List<Integer> numbers = Arrays.asList(5, 3, 8, 6, 2); numbers.stream() .sorted() // 默认自然顺序 .forEach(System.out::println); // 或者使用自定义比较器 numbers.stream() .sorted(Comparator.reverseOrder()) // 反向排序 .forEach(System.out::println); ``` --- #### 总结 上述三种方法各有优劣: - **`Collections.sort()`**:适用于传统集合操作,简单直观。 - **`List.sort()`**:语法更加紧凑,推荐在支持 Java 8+ 的环境中使用。 - **Stream API**:适合复杂的链式操作,但在特定框架集成中需注意副作用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值