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. 浮动类型的排序(例如:浮点数)

类似于整数和字符串,浮点数(floatdouble)也可以使用 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);
    }
}

总结

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

  • 字符串排序:按字母表排序(忽略大小写)。
  • 数字排序:整数、浮动类型按升序或降序排序。
  • 对象排序:可以按多个字段、多个条件进行排序。
  • 稳定排序:确保排序后相等元素的顺序保持不变。
  • 自定义排序:例如按特定位置的字符或元素进行排序。
相关推荐
神奇小汤圆18 分钟前
浅析二叉树、B树、B+树和MySQL索引底层原理
后端
文艺理科生27 分钟前
Nginx 路径映射深度解析:从本地开发到生产交付的底层哲学
前端·后端·架构
千寻girling28 分钟前
主管:”人家 Node 框架都用 Nest.js 了 , 你怎么还在用 Express ?“
前端·后端·面试
南极企鹅30 分钟前
springBoot项目有几个端口
java·spring boot·后端
Luke君6079731 分钟前
Spring Flux方法总结
后端
define952735 分钟前
高版本 MySQL 驱动的 DNS 陷阱
后端
忧郁的Mr.Li1 小时前
SpringBoot中实现多数据源配置
java·spring boot·后端
暮色妖娆丶2 小时前
SpringBoot 启动流程源码分析 ~ 它其实不复杂
spring boot·后端·spring
Coder_Boy_2 小时前
Deeplearning4j+ Spring Boot 电商用户复购预测案例中相关概念
java·人工智能·spring boot·后端·spring
Java后端的Ai之路2 小时前
【Spring全家桶】-一文弄懂Spring Cloud Gateway
java·后端·spring cloud·gateway