//建议通过目录查找需要的内容


一:知识点:

1.遍历数组的方法

1.简单的遍历

1)for循环

for(int i = 0 ;i <length;i++){}

这是通过数组下标来进行数组定位,进而输出数组数值的,使用的情况较多

注意:边界,即i的范围,不能超出数组的数值范围,

2)for each循环

直接迭代数组的每个元素,在for(int n : ns)循环中,n直接拿到ns数组的元素,而不是通过索引,所以:for each的循环更加简洁,缺点是不能直接拿到下标为n的数组元素。

public class Main {
    public static void main(String[] args) {
        int[] ns = {1,3,5,6,78};
        for(int n : ns){
            System.out.println(n);
        }
    }
}

2.打印数组内容

1.直接打印数组名,结果是数组在JVM中的引用地址
public class Main {
    public static void main(String[] args) {
        int[] ns = {1,3,5,6,78};
        int[] num={234,456,36,54};
        System.out.println(ns);         //[I@4eec7777
        System.out.println(num);        //[I@3b07d329
    }
}
2.无特殊要求,使用Arrays.toString()
public class Main {
    public static void main(String[] args) {
        int[] ns = {1,3,5,6,78};
        int[] num={234,456,36,54};
        System.out.println(Arrays.toString(ns));         //[1, 3, 5, 6, 78]
        System.out.println(Arrays.toString(num));        //[234, 456, 36, 54]
    }
}

3.二维数组

定义方式:
public class Main {
    public static void main(String[] args) {
      
            int[][] ns1=new int[3][5];  //3个长度为5的二维数组,默认值为0
            int[] ns2[]=new int[3][4];  //3个长度为4的二维数组,默认值为0
            int[][] ns3=new int[4][];  //4个为null的数组
            
        }
    }
输出方式(for/for each/Arrays.deepToString)
public class Main {
    public static void main(String[] args) {
        int[][] ns = {
                {1,3,6},
                {343,67,3},
                {235,65,2}
        };
        for(int []arr:ns){
            for(int n : arr){
                System.out.print(n);
                System.out.print(',');
            }
        }
        //结果:1,3,6,343,67,3,235,65,2,
        
        //System.out.println(Arrays.deepToString(ns));
        //结果:[[1, 3, 6], [343, 67, 3], [235, 65, 2]]
    }
}

2.数组排序

冒泡排序

原理:

每次比较相邻两个元素,如果第一个比第二个大,就交换,并且i++,一个周期后最后一个就是最大的数据,然后再重复N-1次,每次周期比较N-1-i次,

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

            int[] ns={3,56,54,7,76,4,8,9,23};
            for(int i=0;i<ns.length-1;i++){
                for(int k=0;k<ns.length-1-i;k++){
                    if(ns[k]>ns[k+1]){
                        int tmp = ns[k];
                        ns[k]=ns[k+1];
                        ns[k+1]=tmp;
                    }
                }
            }
        System.out.println(Arrays.toString(ns));
        }
    }

插入排序

快速排序

使用Arrays工具类排序

java标准库中已经内置了排序功能,我们只用调用Arrays.sort()即可

public class Main {
    public static void main(String[] args) {
            int[] ns={3,56,54,7,76,4,8,9,23};
            Arrays.sort(ns);
        System.out.println(Arrays.toString(ns));
        }
    }

3.查找元素

1.无序数组查找指定元素

1)直接遍历整个数组
1.整形数组
public class Main {
    public static void main(String[] args) {

        int[] ns={3,56,54,7,76,4,8,9,23};
        int target = 54;
        int index=-1;
        for(int i=0;i<ns.length;i++){
               if(ns[i]==target){
                   index=i;
                   break;
               }
           }
        System.out.printf("目标数为d%,下表为d%",target,index);
        }
    }

注意是printf,如果找到目标数,则break,不用继续循环。

2.字符串数组
public class Main {
    public static void main(String[] args) {
        String[] ns={"万","李荣启","尼伯龙根","楚子航","路明泽","诺诺"};
        Scanner input = new Scanner(System.in);
        String target = "楚子航";
        int index=-1;
        for(int i=0;i<ns.length;i++){
               if(target.equals(ns[i])){
                   index=i;
                   break;
               }
           }
        System.out.printf("目标"+target+",下标为"+index);
        }
    }

注意:这里是字符串,而字符串之间进行比较要使用equals()进行比较,因为java中字符串是引用类型,所指向的是他的内存地址,用“==”比较的是字符串的内存地址,用equals()比较的是字符串的ASCLL码,ASCLL码一样,两个字符串自然一样。

2)双指针遍历
1.整形数组

通过两个下标,分别从素组头部和尾部对该序列进行遍历,将数组中的元素和指定元素进行比较,从而确定数组中是否有该元素。

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

         int [] array={23,5,356,65,76,3,65,54,4,36};
         int target = 3;
         int index = -1;

         for(int i=0,k=array.length-1;i<k;i++,k--){
             if(array[i]==target){
                 index = i;
                 break;
             }
             if(array[k]==target){
                 index = k;
                 break;
             }
         }
         System.out.printf("目标数%d在数组的下标为:%d",target,index);
    }
}

字符串数组

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

         String [] array={"哈哈","虚无","星河猎手","胡桃","托帕","芙宁娜","那维莱特"};
         String target = "托帕";
         int index = -1;

         for(int i=0,k=array.length-1;i<=k;i++,k--){
             if(target.equals(array[i])){
                 index = i;
                 break;
             }
             if(target.equals(array[k])){
                 index = k;
                 break;
             }
         }
         System.out.printf("目标数%s在数组的下标为:%d",target,index);
    }
}
Arrays工具类的binarySearch()方法

该方法基于二分查找实现,所以在使用前必须先排序

public class Main {
     public static void main(String[] args) {
        int [] array={23,5,356,65,76,3,65,54,4,36};
        int target = 76;
        Arrays.sort(array);  //排序
        int index = Arrays.binarySearch(array,target);

         System.out.printf("下标为%d",index);
     }
}

二分查找元素

在一个有序的集合中,每次拿中间的值和target进行比较,如果中间的值大于target,说明所求的值在中间值的左边,反之则在右边,这样一次就可以筛选出一半的值,极大的缩减所需要花费的时间。

具体的实现如下:

public class Main {
     public static void main(String[] args) {
         int [] array={23,5,356,65,76,3,65,54,4,36};  //数组
         int target = 76;  
         int index = -1;                     //找到下标返回,没找到返回-1
         Arrays.sort(array);
         int low = 0,high = array.length-1;  //定义最小边界和最大边界
         while(low<high){                    //当最小边界的下标小于最大边界的下标才成立,否则说明数组遍历完了
             int mid = (low+high)/2;         //取中间值
             if(array[mid]==target){         //如果中间值就是所要找的数,赋值下标并返回
                 index = mid;
                 break;
             }else if(array[mid]>target){    //如果中间值大于要找的数,则要找的数在中间值的左边
                 high = mid-1;               //因为中间值本身也不是要找的数,所以-1
             }else if(array[mid]<target){    //同上,在右边
                 low = mid+1;
             }
         }
         System.out.printf("下标为%d",index);
     }
}

4.数组乱序(数组洗牌)

题目简介:

有一个大小为100的数组,里面的元素是从1到100,随机从数组中选择50个不重复的数(即产生50个不重复的1-100之间的数字)

实现:

public class Main {
     public static void main(String[] args) {
         int [] array={23,5,356,65,76,3,65,54,4,36};
         for(int i=array.length-1;i>0;i--){
             int index = (int)(Math.random()*i);  //随机产生一个i之前的数的下标
             int target = array[index];   //下面3行是
             array[index] = array[i];
             array[i] = target;
         }
         System.out.println(Arrays.toString(array));
     }
}