• 黑马笔记---常见算法与Lambda表达式


    目录

    1.常见算法

    1.1冒泡排序

    1.2选择排序

    1.3二分查找

    2.Lambda表达式

    2.1Lambda概述

    2.2Lambda实战-简化常见函数式接口

    2.3Lambda表达式的省略规则


    1.常见算法

    1.1冒泡排序

    冒泡排序的思想:每次从数组中找出最大值放在数组的后面去。

    实现冒泡排序的关键步骤:

    1.确定总共需要做几轮: 数组的长度-1。

    2.每轮比较几次:

    3.当前位置大于后一个位置则交换数据。

     代码如下:

    1. import java.util.Arrays;
    2. public class Test3 {
    3. public static void main(String[] args) {
    4. int[] arr = {2,33,5,7,9,10};
    5. bubbleSort(arr);
    6. System.out.println(Arrays.toString(arr));
    7. }
    8. // 2 33 5 7 9 10
    9. // 0 1 2 3 4 5
    10. public static void bubbleSort(int[] arr ){
    11. for (int i = 0; i < arr.length-1; i++) {
    12. for (int j = 0; j < arr.length-1-i; j++) {
    13. if (arr[i]>arr[i+1]) {
    14. int temp = arr[i];
    15. arr[i] = arr[i+1];
    16. arr[i+1] = temp;
    17. }
    18. }
    19. }
    20. }
    21. }

    1.2选择排序

    选择排序的思想:每轮选择当前位置,开始找出后面的较小值与该位置交换。

    选择排序的关键:确定总共需要选择几轮: 数组的长度-1,控制每轮从以前位置为基准,与后面元素选择几次。

     

    1. import java.util.Arrays;
    2. /**
    3. 目标:学会使用选择排序的方法对数组进行排序。
    4. */
    5. public class Test1 {
    6. public static void main(String[] args) {
    7. // 1、定义数组
    8. int[] arr = {5, 1, 3, 2};
    9. // 0 1 2 3
    10. // 2、定义一个循环控制选择几轮: arr.length - 1
    11. for (int i = 0; i < arr.length - 1; i++) {
    12. // i = 0 j = 1 2 3
    13. // i = 1 j = 2 3
    14. // i = 2 j = 3
    15. // 3、定义内部循环,控制选择几次
    16. for (int j = i + 1; j < arr.length; j++) {
    17. // 当前位:arr[i]
    18. // 如果有比当前位数据更小的,则交换
    19. if(arr[i] > arr[j]) {
    20. int temp = arr[i];
    21. arr[i] = arr[j];
    22. arr[j] = temp;
    23. }
    24. }
    25. }
    26. System.out.println(Arrays.toString(arr));
    27. }
    28. }

    1.3二分查找

    二分查找:

    二分查询性能好,二分查找的前提是必须是排好序的数据。

    二分查找相当于每次去掉一半的查找范围。

     

    结论:二分查找正常的检索条件应该是开始位置min <= 结束位置max。

    数组的二分查找的实现步骤是什么样的?

    1.定义变量记录左边和右边位置。

    2.使用while循环控制查询(条件是左边位置<=右边位置)

    3.循环内部获取中间元素索引

    4.判断当前要找的元素如果大于中间元素,左边位置=中间索引+1

    5.判断当前要找的元素如果小于中间元素,右边位置=中间索引-1

    6.判断当前要找的元素如果等于中间元素,返回当前中间元素索引。

    1. /**
    2. 目标:理解二分搜索的原理并实现。
    3. */
    4. public class Test2 {
    5. public static void main(String[] args) {
    6. // 1、定义数组
    7. int[] arr = {10, 14, 16, 25, 28, 30, 35, 88, 100};
    8. // r
    9. // l
    10. //
    11. System.out.println(binarySearch(arr , 35));
    12. System.out.println(binarySearch(arr , 350));
    13. }
    14. /**
    15. * 二分查找算法的实现
    16. * @param arr 排序的数组
    17. * @param data 要找的数据
    18. * @return 索引,如果元素不存在,直接返回-1
    19. */
    20. public static int binarySearch(int[] arr, int data){
    21. // 1、定义左边位置 和 右边位置
    22. int left = 0;
    23. int right = arr.length - 1;
    24. // 2、开始循环,折半查询。
    25. while (left <= right){
    26. // 取中间索引
    27. int middleIndex = (left + right) / 2;
    28. // 3、判断当前中间位置的元素和要找的元素的大小情况
    29. if(data > arr[middleIndex]) {
    30. // 往右边找,左位置更新为 = 中间索引+1
    31. left = middleIndex + 1;
    32. }else if(data < arr[middleIndex]) {
    33. // 往左边找,右边位置 = 中间索引 - 1
    34. right = middleIndex - 1;
    35. }else {
    36. return middleIndex;
    37. }
    38. }
    39. return -1; // 查无此元素
    40. }
    41. }

    2.Lambda表达式

    2.1Lambda概述

    Lambda概述:

    Lambda表达式是JDK 8开始后的一种新语法形式。

    作用:简化匿名内部类的代码写法。

    Lambda表达式的简化格式

    注意:Lambda表达式只能简化函数式接口的匿名内部类的写法形式。

    什么是函数式接口?

    首先必须是接口、其次接口中有且仅有一个抽象方法的形式。

    1. public class LambdaDemo2 {
    2. public static void main(String[] args) {
    3. // 目标:学会使用Lambda的标准格式简化匿名内部类的代码形式
    4. // 注意:Lambda只能简化接口中只有一个抽象方法的匿名内部类形式(函数式接口)
    5. // Swimming s1 = new Swimming() {
    6. // @Override
    7. // public void swim() {
    8. // System.out.println("老师游泳贼溜~~~~~");
    9. // }
    10. // };
    11. // Swimming s1 = () -> {
    12. // System.out.println("老师游泳贼溜~~~~~");
    13. // };
    14. Swimming s1 = () -> System.out.println("老师游泳贼溜~~~~~");
    15. go(s1);
    16. System.out.println("---------------------");
    17. // go(new Swimming() {
    18. // @Override
    19. // public void swim() {
    20. // System.out.println("学生游泳很开心~~~");
    21. // }
    22. // });
    23. // go(() ->{
    24. // System.out.println("学生游泳很开心~~~");
    25. // });
    26. go(() -> System.out.println("学生游泳很开心~~~"));
    27. }
    28. public static void go(Swimming s){
    29. System.out.println("开始。。。");
    30. s.swim();
    31. System.out.println("结束。。。");
    32. }
    33. }
    34. @FunctionalInterface // 一旦加上这个注解必须是函数式接口,里面只能有一个抽象方法
    35. interface Swimming{
    36. void swim();
    37. }

    1.Lambda表达式的基本作用?

    简化函数式接口的匿名内部类的写法。

    2.Lambda表达式有什么使用前提?

    必须是接口的匿名内部类,接口中只能有一个抽象方法。

    2.2Lambda实战-简化常见函数式接口

    注意:通常我们见到的函数式接口上都有一个@FunctionalInterface注解,标记该接口必须是满足函数式接口。

    2.3Lambda表达式的省略规则

    Lambda表达式的省略写法(进一步在Lambda表达式的基础上继续简化)

    1.参数类型可以省略不写。

    2.如果只有一个参数,参数类型可以省略,同时()也可以省略。

    3.如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!

    4.如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写

    1. import javax.swing.*;
    2. import java.awt.event.ActionEvent;
    3. import java.awt.event.ActionListener;
    4. import java.util.Arrays;
    5. import java.util.Comparator;
    6. public class LambdaDemo3 {
    7. public static void main(String[] args) {
    8. Integer[] ages1 = {34, 12, 42, 23};
    9. /**
    10. 参数一:被排序的数组 必须是引用类型的元素
    11. 参数二:匿名内部类对象,代表了一个比较器对象。
    12. */
    13. // Arrays.sort(ages1, new Comparator<Integer>() {
    14. // @Override
    15. // public int compare(Integer o1, Integer o2) {
    16. // return o2 - o1; // 降序
    17. // }
    18. // });
    19. // Arrays.sort(ages1, (Integer o1, Integer o2) -> {
    20. // return o2 - o1; // 降序
    21. // });
    22. // Arrays.sort(ages1, ( o1, o2) -> {
    23. // return o2 - o1; // 降序
    24. // });
    25. Arrays.sort(ages1, ( o1, o2 ) -> o2 - o1 );
    26. System.out.println(Arrays.toString(ages1));
    27. System.out.println("---------------------------");
    28. JFrame win = new JFrame("登录界面");
    29. JButton btn = new JButton("我是一个很大的按钮");
    30. // btn.addActionListener(new ActionListener() {
    31. // @Override
    32. // public void actionPerformed(ActionEvent e) {
    33. // System.out.println("有人点我,点我,点我!!");
    34. // }
    35. // });
    36. // btn.addActionListener((ActionEvent e) -> {
    37. // System.out.println("有人点我,点我,点我!!");
    38. // });
    39. // btn.addActionListener(( e) -> {
    40. // System.out.println("有人点我,点我,点我!!");
    41. // });
    42. // btn.addActionListener( e -> {
    43. // System.out.println("有人点我,点我,点我!!");
    44. // });
    45. btn.addActionListener( e -> System.out.println("有人点我,点我,点我!!") );
    46. win.add(btn);
    47. win.setSize(400, 300);
    48. win.setVisible(true);
    49. }
    50. }

  • 相关阅读:
    游戏史上五个定价最高的量产型游戏机
    python通过jieba和whoosh实现mysql添加全文索引
    如何确认栈中申请的变量地址
    Vue+ElementUI技巧分享:自定义表单项label的文字提示
    2022李宏毅作业hw1—新冠阳性人员数量预测。
    TensorFlow之文本分类算法-4
    SB30100LCT-ASEMI插件肖特基二极管SB30100LCT
    8年经验之谈 —— 记一次接口压力测试与性能调优!
    JWT Token在线解析解码
    C++ for循环中有冒号,for(auto &c:s)与for(auto c:s)的用法
  • 原文地址:https://blog.csdn.net/weixin_65440201/article/details/125493040