3.4 数组中涉及到的常见算法

1.数组元素的赋值(杨辉三角,回型数等)

杨辉三角

package atguigu.exer;
//杨辉三角
public class ArrayDemo2 {
    public static void main(String[] args) {
        //1.声明并初始化二维数组
        int[][] arr = new int[10][];
        //2.给数组的元素赋值
        for(int i = 0;i < arr.length;i++){
            arr[i] = new int[i + 1];

             //2.1给首末元素赋值
            arr[i][0] = 1;
            arr[i][i] = 1;
            //2.2给每行的非首末元素赋值
            //if(i > 1){
                for(int j = 1;j < arr[i].length - 1;j++){
                    arr[i][j] = arr[i-1][j-1] + arr[i-1][j];

                }
            //}
        }            
        //3.遍历二维数组
        for(int i = 0;i < arr.length;i++){
            for(int j = 0;j < arr[i].length;j++){
                System.out.print(arr[i][j] + "  ");

            }

            System.out.println();
        }

    }
}

2.求数值型数组中元素的最大值,最小值,平均数,总和等

package com.atguigu.java;
/*
 * [10.99]
 * 公式:(int)(Math.random()*(99 - 10 + 1) + 10)
 */
public class ArrayTest1 {
    public static void main(String[] args) {
        int[] arr = new int[10];

        for(int i = 0;i < arr.length;i++){
            arr[i] = (int)(Math.random()*(99 - 10 + 1) + 10);
        }
        for(int i = 0;i < arr.length;i++){
            System.out.print(arr[i]);
            System.out.println();
        }    
        //求数组元素的最大值
        int maxValue = 0;
        for(int i = 0;i < arr.length;i++){
            if(maxValue < arr[i]){
                maxValue = arr[i];
            }
        }
        System.out.println("最大值为: " + maxValue);
        //求数组元素的最小值
        int minValue = arr[0];
        for(int i = 0;i < arr.length;i++){
            if(minValue > arr[i]){
                minValue = arr[i];
            }
        }
        System.out.println("最小值为: " + minValue);
        //求数组元素的总和
        //sum
        //求数组元素的平均数
        //double avgValue = sum/arr.length;
    }
}

3.数组的复制,反转,查找(线性查找,二分法查找)

复制,翻转,查找

package atguigu.exer;

public class ArrayExer1 {
    public static void main(String[] args){
        int[] arr1,arr2;
        arr1 = new int[]{2,3,5,7,11,13,17,19};
        //显示arr1的内容
        for(int i = 0;i < arr1.length;i++){
            System.out.print(arr1[i] + "\t");
        }
        //复制
        arr2 = new int[arr1.length];
        for(int i = 0;i < arr2.length;i++){
            arr2[i] = arr1[i];
        }
        //赋值arr2变量等于arr1
        //不能称作数组的复制
        //arr2 = arr1;
        //修改arr2中的偶索引元素,使其等于索引值
        for(int i = 0;i <arr2.length;i++){
            if(i % 2 == 0){
                arr2[i] = i;

            }
        }

        System.out.println();
        for(int i = 0;i < arr1.length;i++){
            System.out.print(arr1[i] + "\t");
        //数组的反转
        }

    }


}
package atguigu.exer;

public class ArrayExer2 {
    public static void main(String[] args){
        //数组的反转
        String[] arr = new String[]{"a","b","c","d","e","f"}; 
        for(int i = 0;i < arr.length / 2;i++){
            String temp = arr[i];
            arr[i] = arr[arr.length - i - 1];
            arr[arr.length - i - 1] = temp;
        }
        //遍历
        for(int i = 0;i < arr.length;i++){
            System.out.print(arr[i] + " ");
        }
        //查找(搜索)
        //线性查找:
        System.out.println();
        String dest = "b";
        boolean isFlag = true;
        for(int i = 0;i < arr.length;i++){
            if(dest.equals(arr[i])){
                System.out.println("找到了指定元素,位置为: " + i);
                isFlag = false;
                break;
            }
        }
        if(isFlag){
        System.out.println("很遗憾,没有找到");
        }
        System.out.println("*********************");
        //二分法查找:(熟悉)
        //前提:索要查找的数组必须有序。
        int[] arr2 = new int[]{-98,-34,2,34,54,66,79,105,210,333};

        int dest1 = -34;
        int head = 0;//初始的首索引
        int end = arr2.length - 1;//初始的末索引
        boolean isFlag1 = true;
        while(head <= end){

            int middle = (head + end)/2;

            if(dest1 == arr2[middle]){
                System.out.println("找到了指定元素,位置为: " + middle);
                isFlag1 = false;
                break;

            }else if(arr2[middle] > dest1){
                end = middle - 1;

            }else{//arr[middle] < dest1
                head = middle + 1;
            }
        }
        if(isFlag1){
            System.out.println("没有找到");
        }

    }    
}

4.排序算法

(1)时间复杂度:分析关键字的比较次数和记录的移动次数
(2)空间复杂度:分析排序算法中需要多少辅助内存
(3)稳定性:若两个记录A和B的关键字值相等,但排序后A,B的先后次序保持不变,则称这种排序算法是稳定的。
排序算法分类:内部排序外部排序
需要借助外部存储器的叫做外部排序

冒泡排序

package com.atguigu.java;
/*
 * 数组冒泡排序的实现
 */
public class BubbleSortTest {
    public static void main(String[] args){

        int[] arr = new int[]{43,32,76,-98,0,64,33,-21,32,99};
        //冒号排序
        for(int i = 0;i < arr.length - 1;i++){

            for(int j = 0;j < arr.length - 1 - i;j++){

                if(arr[j] > arr[j + 1]){
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        for(int i = 0;i < arr.length;i++){
            System.out.print(arr[i] + "  ");
        }
    }

}

3.5 Arrays工具类的使用

package com.atguigu.java;

import java.util.Arrays;

/*
 * java.util.Arrays:操作数组的工具类,里面定义了很多操作数组的方法
 * 
 * 
 */
public class ArraysTest {
    public static void main(String[] args) {
        //1.boolean equals(int[] a,int[] b):判断两个数组是否相等
        int[] arr1 = new int[]{1,2,3,4};
        int[] arr2 = new int[]{1,3,2,4};
        boolean isEquals = Arrays.equals(arr1,arr2);
        System.out.println(isEquals);
        //2.String toString(int[] a ):输出数组信息
        System.out.println(Arrays.toString(arr1));
        //3.void fill(int[] a,int val):将指定值填充到数组之中
        Arrays.fill(arr1, 10);
        System.out.println(Arrays.toString(arr1));

        //4.void sort(int[] a):对数组进行排序
        Arrays.sort(arr2);
        System.out.println(Arrays.toString(arr2));

        //5.int binary Search(int[] a,int key)
        int[] arr3 = new int[]{-98,-34,2,34,54,66,79,105,210,333};
        int index = Arrays.binarySearch(arr3, 210);
        if(index > 0){
        System.out.println(index);
        }else{
            System.out.println("没找到");

        }
    }
}

3.6 数组使用中的常见异常

1.数组角标越界的异常:ArrayIndexOutOfBoundsException
2.空指针异常:NullPointerException

4.面向对象

4.1 面向过程和面向对象

  • 一、Java面向对象学习的三条主线:(第4-6章)

  • 1.Java类及类的成员:属性,方法,构造器;代码块,内部类

  • 2.面向对象的三大特征:封装性,继承性,多态性(抽象性)

  • 3,其他关键字:this,super,static,final,abstract,interface,package,import等

  • “大处着眼,小处着手”

  • 二、“人把大象装进冰箱”

  • 1.面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做

  • ①把冰箱门打开

  • ②抬起大象,塞进冰箱

  • ③把冰箱门关闭

  • 2.面向对象:强调具备了功能的对象,以类/对象为最小单位,考虑谁来做

三、面向对象的两个要素

  • 类:是对一类事物的描述,是抽象的,概念上的定义
  • 对象:是实际存在的该类事物的每个个体,因而也称为实例(instance)
  • 面向对象程序设计的重点是类的设计

  • 设计类,就是设计类的成员

/*
 * 一、设计类,其实就是设计类的成员
 * 
 * 属性 = 成员变量 = field = 域
 * 方法 = 成员方法 = 函数 = method
 * 
 * 
 * 创建类的对象 = 类的实例化
 * 
 * 二、类和对象的使用(面向对象思想落地的实现):
 * 1.创建类:设计类的成员
 * 2.创建类的对象
 * 3.通过“对象.属性”或“对象.方法”调用对象的结构
 * 
 * 三、如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非static的)
 *    意味着如果我们修改一个对象的属性a,则不影响另外一个对象属性a的值。
 * 
 * 四、对象的内存解析
 * 
 */

package com.atguigu.java;
//测试类
public class PersonTest {
    public static void main(String[] args) {
        //创建Person类的对象
        Person p1 = new Person();
        //调用对象的结构:属性、方法
        //调用属性:“对象、属性”
        p1.name = "Tom";
        p1.isMale = true;
        System.out.println(p1.name);

        //调用方法:“对象.方法”
        p1.eat();
        p1.sleep();
        //*************************
        Person p2 = new Person();
        System.out.println(p2.name);//null
        //********************
        //将p1变量保存的对象地址赋给p3,导致p1,p3指向了堆空间中的同一个对象实体
        Person p3 = p1;
        System.out.println(p3.name);//Tom

        p3.age = 10;
                System.out.println(p1.age);
    }
}

 class Person{
    //属性
    String name;
    int age;
    boolean isMale;

    //方法
    public void eat(){
        System.out.println("人可以吃饭");
    }
    public void sleep(){
        System.out.println("人可以睡觉");

    }                    
}    

类中属性的使用

package com.atguigu.java;
/*
 * 类中属性的使用
 * 
 * 属性(成员变量)  VS 局部变量
 * 1.相同点:
 *     1.1 定义变量的格式:数据类型 变量名 = 变量值
 *     1.2 先声明,后使用
 *  1.3 变量都有其对应的作用域
 * 2.不同点:
 *     2.1 在类中声明的位置的不同
 *     属性:直接定义在类的一对{}内
 *     局部变量:声明在方法内, 方法形参,代码块内,构造器形参,构造器内部的变量
 *  2.2关于权限修饰符的不同
 *  属性:可以在声明属性时,指明其权限,使用权限修饰符。
 *  常用的权限修饰符:private,public,缺省,protected ---->封装性
 *  目前:大家声明属性时,都使用缺省就可以了
 *  局部变量:不可以使用权限修饰符
 *  
 *  2.3 默认初始化值的变化
 *  属性:类的属性,根据其类型,都有默认初始化值
 *       整型(byte,short,int,long),0
 *      浮点型(float,double),0.0
 *      字符型(char):0
 *      布尔型(boolean):false
 *  
 *      引用数据类型(类,数组,接口):Null
 *  
 *  局部变量:没有默认初始化值
 *      意味着我们在调用局部变量之前,一定要显示赋值
 *       特别地,形参在调用时,我们赋值即可
 *  2.4 在内存中加载的位置,
 *  属性:加载到堆空间中(非static)
 *  局部变量:加载到栈空间       
 */
public class UserTest {

}

class User{
    //属性(或成员变量)
    private String name;
    public int age;
    boolean isMale;

    public void talk(String language){//形参,也是局部变量
        System.out.println("我们使用" + language + "进行交流");

    }
    public void eat(){//局部变量
        String food = "烙饼";
        System.out.println("北方人喜欢吃: " + food);


    }
}

类中方法的使用和说明

package com.atguigu.java;
/*
 * 类中方法的声明和使用
 * 
 * 方法:描述类应该具有的功能
 * 比如:Math类,sqrt()\random()
 *         Scanner类,nextXxx()
 *      Arrays类,sort()\binarySearch()
 *      
 * 1.举例:     
 * public void eat(){}
 * public void sleep(int hour){}
 * public String getName(){}
 * public String getNation(String nation){
 * 
 * }
 * 
 * 2.方法的声明:权限修饰符 返回值类型 方法名(形参列表){
 *             方法名
 * }
 *         注意:static,final,abstract来修饰的方法,后面再讲
 * 
 * 3.说明:
 *         3.1关于权限修饰符:
 *             java规定的4种权限修饰符:private,public,缺省,protected --->封装性再讲
 *         3.2返回值类型:有返回值 vs 没有返回值
 *             3.2.1如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中需要使用
 *                 return关键字来返回指定类型的变量或常量。
 *                 如果方法没有返回值,则方法声明时,使用void表示-通常没有返回值的方法中    
 *                 就不需要使用return,如果使用的话,只能"return"表示结束此方法
 *             3.2.2我们定义方法该不该有返回值?
 *                 (1)题目要求
 *                 (2)凭经验:具体问题具体分析    
 *         3.3方法名:属于标识符,遵循标识符的规则和规范,见名知意
 *         3.4形参列表:方法可以声明0个,1个或多个形参
 *             3.4.1格式:数据类型1 形参1,数据类型2,形参2,.....
 *             
 *             3.4.2我们定义方法时,该不该定义形参
 *                 ①题目要求
 *                 ②凭经验,具体问题具体分析
 *             3.5方法体:方法功能的体现
 * 
 * 4.return关键字的使用    :
 *         1.适用范围:使用在方法体中
 *         2.作用:(1)结束方法
 *                     (2)针对于有返回值类型的方法,使用"return 数据"    方法返回所要的数据。
 *                 (3)注意点:return关键字后面不可以声明执行语句
 * 5.方法的使用中,可以调用当前类的属性或方法
 *             特殊的:方法A中又调用了方法A,递归方法。
 *      方法中不可以定义方法
 */
public class CustomerTest {
    public static void main(String[] args){
        //int[] arr = new int[]{1,2,7,5,4,3};
        //cust1.sort(arr);

    }

}

//客户类
class Customer{


    //属性
    String name;
    int age;
    boolean isMale;

    //方法
    public void eat(){
        System.out.println("客户吃饭");        
    }
    public void sleep(int hour){
        System.out.println("休息了" + hour + "个小时");
        }
    public String getName(){
        return name;

    }
    public String getNation(String nation){
        String info = "我的国籍是:" + nation;
        return info;
    }
//    public void sort(int[] arr){


//    }
}