LeetCode刷题常见的Java排序

1. 字符串排序(字母排序)

首先,你的代码实现了根据字母表顺序对字符串中的字母进行排序,忽略了大小写并且保留了非字母字符的位置。关键点是:

  • 提取和排序字母 :通过 Character.isLetter() 判断是否为字母,并利用 Character.toLowerCase() 来忽略大小写进行排序。
  • 保留非字母字符位置 :通过使用 StringBuilder,非字母字符保持原位,而排序的字母字符填充到原字母位置。

2. 整数排序(按升序或降序排序)

如果我们要对一个包含整数的列表进行排序,可以通过 Collections.sort() 或 Arrays.sort() 来实现。这些方法对原始数据类型(如整数、浮点数)也适用。

例如,以下是对整数进行升序排序的例子:

java 复制代码
import java.util.*;

public class IntegerSort {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(10, 1, 5, 8, 3);
        
        // 升序排序
        Collections.sort(numbers);
        System.out.println("升序排序: " + numbers);

        // 降序排序
        Collections.sort(numbers, Collections.reverseOrder());
        System.out.println("降序排序: " + numbers);
    }
}
  • 升序排序 :Collections.sort() 将整数按照从小到大的顺序排序。
  • 降序排序 :Collections.reverseOrder() 提供了降序排序。

3. 自定义排序规则

你可以为各种类型(字符串、整数等)定义自定义排序规则,通过实现 Comparator 来实现。比如,按某种复杂规则排序的例子:

java 复制代码
import java.util.*;

public class CustomSort {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("apple", "Banana", "cherry", "date");
        
        // 按照字母长度排序(升序)
        words.sort(Comparator.comparingInt(String::length));
        System.out.println("按长度排序: " + words);
    }
}

这里我们使用了 Comparator.comparingInt() 来根据字符串的长度排序。

4. 浮动类型的排序(例如:浮点数)

类似于整数和字符串,浮点数(float 或 double)也可以使用 Arrays.sort() 或 Collections.sort() 进行排序。这里需要特别注意浮点数的比较,由于精度问题,有时会存在 NaN 或无限大值的特殊情况。

java 复制代码
import java.util.*;

public class FloatSort {
    public static void main(String[] args) {
        List<Double> numbers = Arrays.asList(10.5, 1.1, 5.3, 8.8, 3.9);
        
        // 升序排序
        Collections.sort(numbers);
        System.out.println("浮动类型升序排序: " + numbers);

        // 降序排序
        Collections.sort(numbers, Collections.reverseOrder());
        System.out.println("浮动类型降序排序: " + numbers);
    }
}

5. 对对象进行排序(按多个字段排序)

在处理自定义对象时,我们可以通过实现 Comparable 接口或使用 Comparator 来实现多条件排序。例如,假设我们有一个 Person 类,并且需要根据 年龄 和 姓名 进行排序:

java 复制代码
import java.util.*;

class Person {
    String name;
    int age;
    
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}

public class ObjectSort {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
                new Person("Alice", 30),
                new Person("Bob", 25),
                new Person("Charlie", 30),
                new Person("Dave", 20)
        );
        
        // 按年龄排序,如果年龄相同,则按姓名排序
        people.sort(Comparator.comparingInt(Person::age).thenComparing(Person::name));
        System.out.println("按年龄和姓名排序: " + people);
    }
}

6. 稳定排序

在你原来的代码中,提到 "同一字母的大小写同时存在时,按照输入顺序排列" 。这就要求你使用 稳定排序 ,即在排序过程中,若两个元素相等,排序后它们的相对顺序保持不变。Java 中的 Arrays.sort() 和 Collections.sort() 默认使用稳定排序(Timsort 算法)。

7. 按特殊规则排序

除了普通的升降序排序,你还可以根据特定的条件进行排序。例如,你可以按字符串的最后一个字母、字符串中某个特定位置的字符等进行排序。

java 复制代码
import java.util.*;

public class SpecialSort {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("apple", "banana", "cherry", "date");
        
        // 按照每个字符串的最后一个字母排序
        words.sort(Comparator.comparingInt(word -> word.charAt(word.length() - 1)));
        System.out.println("按最后一个字母排序: " + words);
    }
}

总结

你所提供的字符串排序技巧实际上是一种 自定义排序规则 的实现。在不同的数据类型中,类似的技巧可以用来进行排序,特别是当排序需求复杂或者涉及多个条件时,使用 Comparator 或 Comparable 接口来控制排序行为非常重要。常见的排序技巧总结如下:

  • 字符串排序:按字母表排序(忽略大小写)。
  • 数字排序:整数、浮动类型按升序或降序排序。
  • 对象排序:可以按多个字段、多个条件进行排序。
  • 稳定排序:确保排序后相等元素的顺序保持不变。
  • 自定义排序:例如按特定位置的字符或元素进行排序。
相关推荐
用户别睡觉6 分钟前
自己搭的中文 PDF RAG 接了 Redis 缓存、跑了 RAGAS,以为能写“提速多少、准确率多少”,结果两个都没按预期来。
后端
彭亚川Allen13 分钟前
985 在职研究生到底怎么样?是不是水硕?是不是.....?
前端·后端·程序员
乘风24815 分钟前
# 我做了个会遗忘的 AI 记忆,召回率反而从 8% 涨到 100%
后端
Rain的Java大神之路31 分钟前
面试被LeetCode 27(移除元素)问懵?别再用两层 for 循环了:一道“简单题”吃透双指针原地删除,附面试加分话术 + 11 个避坑清单
后端·leetcode·面试
利威尔xu1 小时前
Go IM 源码实战(11):token 只是个 HASH,多端互踢的顺序错了就踢错人
后端·微服务·面试·架构·golang
猿究院--Cu-Sn合金1 小时前
Spring Boot + DeepSeek 求职 Agent 实践:工具注册、多轮调用与简历 JD 对比
数据库·人工智能·spring boot·后端·deepseek
程序员cxuan1 小时前
别学 subagent 了,很可能要凉了。
后端·agent·ai编程
小咕聊编程1 小时前
基于Django的个人摄影博客网站设计与开发
后端·python·django
未秃头的程序猿2 小时前
@ConditionalOnMissingBean 把我配好的 RabbitMQ 手动 ack 吃掉了
后端·rabbitmq
回家路上绕了弯2 小时前
当 AI 成为队友:团队协作使用 AI 的实践与思考
后端