当前位置: 首页 > article >正文

java之Collection

List:

 

Set:

HashSet

JDK8以后,当链表长度超过83,而且数组长度大于等于64时,自动转换为红黑树 必须同时满足

LinkedHashSet:

TreeSet: 

 

如何在 Java 中实现排序(简单易懂版)

排序是我们在编程中经常需要实现的功能,无论是对数字、字符串,还是自定义对象进行排序,Java 都提供了非常强大的工具。今天,我们来一起学习如何用最简单的方式实现排序! 

数组的排序方式

对于数组,Java 提供了 Arrays.sort 方法进行排序:

  1. 基本类型数组排序:

    import java.util.Arrays;
    
    public class Main {
        public static void main(String[] args) {
            int[] arr = {5, 2, 8, 1};
            System.out.println("Before sorting: " + Arrays.toString(arr));
    
            Arrays.sort(arr);  // 默认升序排序
    
            System.out.println("After sorting: " + Arrays.toString(arr));
        }
    }
    
  2. 对象数组排序(需要实现 Comparable 或提供 Comparator):

    import java.util.Arrays;
    import java.util.Comparator;
    
    class Person {
        String name;
        int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public String toString() {
            return name + " (" + age + ")";
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Person[] persons = {
                new Person("Alice", 30),
                new Person("Bob", 25),
                new Person("Charlie", 35)
            };
    
            // 按年龄升序排序
            Arrays.sort(persons, Comparator.comparingInt(p -> p.age));
    
            System.out.println("After sorting: " + Arrays.toString(persons));
        }
    }
    

    以上方法使用了提供Comparator方法。如果对于一个自定义对象根据情况不同,存在不同的排序方式,选择提供Comparator方法。如果排序规则是一定的,那么就实现Compareable接口


列表的排序

以ArrayList为例子。注意ArrayList当中还存在list.sort 的静态方法

package collection.ArrayListTest;

import java.util.ArrayList;
import java.util.Comparator;

public class ArrayStudentTest {
    public static void main(String[] args) {
        ArrayList <ArrayStudent> list = new ArrayList<>();
        //创建学生对象
        ArrayStudent s1 = new ArrayStudent("ZhangSan",50);
        ArrayStudent s2 = new ArrayStudent("LiSi",16);
        ArrayStudent s3 = new ArrayStudent("LiYuPing",23);
        list.add(s1);//加入的是地址值,而不是对象本身
        list.add(s2);
        list.add(s3);
           list.sort(((o1, o2) -> o1.getAge()-o2.getAge()));
//        list.sort((Comparator.comparingInt(ArrayStudent::getAge)));
        for (ArrayStudent a : list) {
            System.out.println(a.getAge()+" "+a.getName());
        }
    }
}

1. 对普通列表排序

场景:假设有一个整数列表 ArrayList,我们想将它从小到大排序。

代码

import java.util.ArrayList;
import java.util.Collections;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(5);
        list.add(2);
        list.add(8);
        list.add(1);

        System.out.println("Before sorting: " + list);

        Collections.sort(list);  // 默认升序排序

        System.out.println("After sorting: " + list);
    }
}

运行结果

Before sorting: [5, 2, 8, 1]
After sorting: [1, 2, 5, 8]

2. 对字符串排序

场景:我们有一个字符串列表,想按字母顺序排列。

代码

import java.util.ArrayList;
import java.util.Collections;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("banana");
        list.add("apple");
        list.add("cherry");

        System.out.println("Before sorting: " + list);

        Collections.sort(list);  // 默认按字母升序

        System.out.println("After sorting: " + list);
    }
}

运行结果

Before sorting: [banana, apple, cherry]
After sorting: [apple, banana, cherry]

3. 对自定义对象排序

场景:我们有一个 Person 类,想按照年龄对一组人进行排序。

方法 1:实现 Comparable 接口(自然排序)

代码

import java.util.ArrayList;
import java.util.Collections;

class Person implements Comparable<Person> {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Person other) {
        return this.age - other.age;  // 按年龄升序
    }

    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}

public class Main {
    public static void main(String[] args) {
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("Alice", 30));
        list.add(new Person("Bob", 25));
        list.add(new Person("Charlie", 35));

        System.out.println("Before sorting: " + list);

        Collections.sort(list);  // 使用自然排序

        System.out.println("After sorting: " + list);
    }
}

运行结果

Before sorting: [Alice (30), Bob (25), Charlie (35)]
After sorting: [Bob (25), Alice (30), Charlie (35)]

方法 2:使用 Comparator 接口(自定义排序)

代码

import java.util.ArrayList;
import java.util.Comparator;

class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}

public class Main {
    public static void main(String[] args) {

        ArrayList<ArrayStudent> listSort = new ArrayList<>();
        listSort.add(new ArrayStudent("Alice", 30));
        listSort.add(new ArrayStudent("Bob", 25));
        listSort.add(new ArrayStudent("Charlie", 35));


        // 按年龄升序序排序
        Collections.sort(listSort,(o1,o2)->o1.getAge()- o2.getAge());
        System.out.println("After sorting by age: " );
        listSort.forEach(s-> System.out.println(s.getName()+":"+s.getAge()));

//         按年龄降序排序
        listSort.sort((p1, p2) -> p2.getAge() - p1.getAge());
        System.out.println("After sorting by age (descending): ");
        listSort.forEach(s-> System.out.println(s.getName()+":"+s.getAge()));

}

运行结果

Before sorting: [Alice (30), Bob (25), Charlie (35)]
After sorting by name: [Alice (30), Bob (25), Charlie (35)]
After sorting by age (descending): [Charlie (35), Alice (30), Bob (25)]

注意!!这两者不能记混了:

Comparator 是用于定义外部比较器的,它不应该直接由实体类实现,通常是创建一个单独的类或匿名类来定义比较规则。如果让实体类实现了 Comparator,就会破坏逻辑结构,因为实体类变成了一个比较器,且多了与自身逻辑无关的职责 。所以注意实体类实现了Comparable接口


5. 小结
  • 简单排序Collections.sortList.sort 是最常用的方法,适用于基本类型和 String。也就是输对于基本类型和String我们不需要在自定义排序规则。
  • 自定义对象排序
    • 在对象的定义当中实现 Comparable 定义自然排序。
    • 使用 Comparator 实现灵活的自定义排序。
  • 其他容器
    • HashSetLinkedHashSet 需要转换为 List 进行排序。
    • TreeSetTreeMap 天然有序。
    • HashMap 可以通过转换为条目列表实现排序。


http://www.kler.cn/a/473432.html

相关文章:

  • 【CSS】设置滚动条样式
  • 实现自定义集合类:深入理解C#中的IEnumerable<T>接口
  • Visio 画阀门 符号 : 电动阀的画法
  • 使用 uniapp 开发微信小程序遇到的坑
  • vue3运行时执行过程步骤
  • QT c++ 按钮 样式 设置按下和松开的背景颜色
  • USB 驱动开发 --- Gadget 设备连接 Windows 免驱
  • 基于物联网疫苗冷链物流监测系统设计
  • go语言学习 笔记 1(变量,语法,数据类型)
  • 【.NET】Kafka消息队列介绍,使用Confluent.Kafka集成Kafka消息队列
  • 如何使用脚手架工具开始,快速搭建一个 Express 项目的基础架构
  • Online Judge PTA 最大公约数与最小公倍数
  • 网络安全 基础入门-概念名词
  • 文件读写到SQLite数据库的方法
  • C++编程等级认证学习计划day2-1
  • 万界星空科技质量管理QMS系统具体功能介绍
  • AT6668-6N-22:BDS定位SOC芯片,常用在车载系统
  • TensorRT-LLM中的MoE并行推理
  • 【linux系统之redis6】redisTemplate的使用方法
  • 如何轻松反转C# List<T>中的元素顺序
  • “多维像素”多模态雷视融合技术构建自动驾驶超级感知能力|上海昱感微电子创始人蒋宏GADS演讲预告
  • Kafka优势剖析-消费者组、并行消费
  • JavaFX基础之环境配置,架构,FXML
  • GoChina备案管家
  • 深入Android架构(从线程到AIDL)_17 SurfaceView的UI多线程01
  • 数据库中的并发控制