JAVA---数组(练习)

/**
   数组Array的学习
*/
public class ArrayDemo01{
	public static void main(String[] args){
	    /*数组的声明和初始化:
		  --初始化有三种写法
            --静态初始化(1种)
			--动态初始化(2种)		
		*/
		/*存储整型3,4,6,1,2
		
		*/
		int[] nums = {3,4,5,1,2};
		int[] num_s = new int[]{3,4,6,1,2};
		/*输出数组nums的元素个数*/
		System.out.println("nums:"+nums.length);
		System.out.println("num_s:"+num_s.length);
		/*访问nums的第一个元素
		  访问num_s的最后一个元素
		  并输出
		*/
		int num = nums[0];
		System.out.println("num:"+num);
		System.out.println("num_s[4]:"+num_s[4]);

	}
}

数组的赋值 

/**
    数组间的赋值:即变量的赋值
*/
public class ArrayDemo04{
	public static void main(String[] args){
	    int[] arr1 = {1,3,5,7,100};
		int[] arr2 = arr1;
		for (int i = 0;i<arr2.length ;i++ ){
			System.out.print(arr2[i]+"\t");
		}
		System.out.println();
		/*将arr2的第一个元素改为1000*/
		arr2[0] = 1000;
		for (int i = 0;i<arr2.length ;i++ ){
			System.out.print(arr2[i]+"\t");
		}
		/*遍历一下arr1的元素*/
		System.out.println();
        for (int i = 0;i<arr1.length ;i++ ){
			System.out.print(arr1[i]+"\t");
		}
		/*
		   数组间的变量赋值,
		   通过一个变量对数组的元素进行修改,
		   那么与之相关的变量对应的数组的元素
		   也会发生变化。
		   如:
		      int[] a = {1,2,3};
			  int[] b =a;
			  通过b修改元素,a对应的数组也跟着改变
		*/		
		
		/*基本数据类型变量间的赋值*/
		int a = 5;
		int b = a;
		b = 10;
		System.out.println(b);
		System.out.println(a);

	}
}

Arrays的调用和使用

/**
   数组的工具类:Arrays
   使用步骤:
   1:导包
   2:调用其功能

*/

import java.util.Arrays;
public class ArrayDemo05{
	public static void main(String[] args){
	    int[] scores = {1,2,10,100};
		String info = Arrays.toString(scores);
		System.out.println(info);

		//也可以直接写
		int[] sc = {1,2,10,100};
		System.out.println(Arrays.toString(sc));

		//创建5个长度的布尔数组fs
		boolean[] fs = new boolean[5];
		System.out.println(Arrays.toString(fs));

		//查看fs数组的第六个元素
		System.out.println(fs[5]);/*Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
                                    at ArrayDemo05.main(ArrayDemo05.java:25)
		                            数组下标越界异常,编译器检查不出来此异常,运行时才会出现。出现的结果
									造成了程序的结束。
		                           */
		System.out.println("over");
	}
}

数组工具类复制

/**
    工具类的数组复制功能

*/
import java.util.Arrays;
public class ArrayDemo07{
	public static void main(String[] atgs){
	    int[] nums = {1,2,3,4,5};
		int[] num1 = Arrays.copyOf(nums,5);
		System.out.println(Arrays.toString(num1));
		/*创建要给int类型的num2,长度为10,前五个元素为num1的内容。*/
		int[] num2 = Arrays.copyOf(num1,10);
		System.out.println(Arrays.toString(num2));

		/*创建一个数组num3,长度为4,存储num1的前四个元素*/
		int[] num3 = Arrays.copyOf(num1,4);
		System.out.println(Arrays.toString(num3));
	}
}

 数组的定义遍历存值

public class TestDemo01{
	public static void main(String[] args){
	    /*定义一个字符数组chs,存储a~z*/
        /*定义一个字符串数组names,
		  存储10个学生的姓名
		*/
        /*
		  定义一个int数组scores,用于存储这10个学生的成绩,
		  成绩使用随机数[90,100],计算出平均成绩
		  找到成绩的最大值,并输出其姓名
		  找到成绩的最小值,并输出其姓名
		*/
		char[] chs = new char[26];
        for (int i=0;i<chs.length ;i++ ){
			chs[i]=(char)(i+97);
			System.out.print(chs[i]+" ");
        }
        System.out.println();

		String[] names = new String[10];
		for (int i = 0;i<names.length ;i++ ){
			names[i]="小"+(char)(i+65);
            System.out.print(names[i]);
		}
        System.out.println();

        int sum = 0;        
		int[] scores = new int[names.length];
		for (int i = 0;i<scores.length ;i++ ){
			int s =(int)(Math.random()*11+90);
			scores[i] = s;
			sum+=s;
			System.out.print(scores[i]+" ");
		}
        double avg_score = sum/scores.length;
		System.out.println("平均分为:"+avg_score);

	    int max = scores[0];
		int min = scores[0];
		for (int i = 0;i<scores.length ;i++ ){
				if (scores[i]>max){				    
					max = scores[i];
			    }
				if (scores[i]<min){
					min = scores[i];
				}
	    }
		System.out.println("最高成绩为:"+max);
		System.out.println("最低成绩为:"+min);



		/*
		需要直到最高最低成绩的下标,才能知道人名
		而最高/最低成绩的下标可能有多个,需要保存
		到一个新数组
		统计最高成绩/最低成绩的人数
		*/
		int h_count = 0;
		int l_count = 0;
		for (int i = 0;i<scores.length ;i++ ){
			if (scores[i]==max){
				  h_count++;      //统计最高成绩的个数
			}
			if (scores[i]==min){
                  l_count++;     //统计最低成绩的个数
			}
		}
		//将最高/最低成绩的下标存入新数组中
		int [] max_indexs = new int[h_count];//用来存储最高成绩的下标
		int max_count = 0;//用于下标的自增
		int [] min_indexs = new int[l_count];
        int min_count = 0;//用于下标的自增
		for (int i = 0;i<scores.length ;i++ ){
			if (scores[i]==max){
				max_indexs[max_count++]=i;//找到最高成绩的下标并存入新数组
			}
			if (scores[i]==min){
                min_indexs[min_count++]=i;
			}
		}
		/*
    		输出 最高成绩的姓名和分数
			从存储下标的数组中,取出值,此值是names数组的下标
		*/
		for (int i = 0;i<max_indexs.length ;i++ ){
			int v = max_indexs[i];
			System.out.println("最高成绩者:"+names[v]+":"+scores[v]);
		}
		/*输出 最低成绩的姓名和分数*/
        for (int i = 0;i<min_indexs.length ;i++ ){
			int v = min_indexs[i];
			System.out.println("最低成绩者:"+names[v]+":"+scores[v]);
		}

	}
}

 练习1:/*
  创建一个长度为n [50,100]的字符数组.
  随机存储n个小写的英文字母,
  然后统计每个字母出现的次数。
*/

三种方法

import java.util.Arrays;
public class TestDemo03{
	public static void main(String[] args){
		int n = (int)(Math.random()*51+50);
		char[] num = new char[n];	
		for (int i = 0;i<num.length ;i++ ){
			 num[i] = (char)(Math.random()*26+97);			
		}
		System.out.println(Arrays.toString(num));		
		for (int i = 0;i<num.length ;i++ ){
			int sum = 0;
			boolean label = true;
			for (int j = 0;j<num.length ;j++ ){
				 if (num[i]==num[j]){
                     sum++;
				 }
			}
			for (int k = 0;k<i ;k++ ){
				if (num[i]==num[k]){
					label = false;
				}
			}
			if (label){
                System.out.println(num[i]+":"+sum);
			}
		}

		//方法二
		int n1 = (int)(Math.random()*51+50);
		char[] num1 = new char[n1];	
		for (int i = 0;i<num1.length ;i++ ){
			 num1[i] = (char)(Math.random()*26+97);			
		}
		System.out.println(Arrays.toString(num1));
		int[] num2 = new int[0];
		for (int i = 0;i<num1.length ;i++ ){
			boolean f = true;
			for (int j = 0;j<num2.length ;j++ ){
				 if (num2[j]==num1[i]){
                     f = false;
					 break;
				 }
			}
			if (f){
				num2 = Arrays.copyOf(num2,num2.length+1);
				num2[num2.length-1]=(int)num1[i];
			}
		}
		for (int i = 0;i<num2.length ;i++ ){
			int sum = 0;
			for (int j = 0;j<num1.length ;j++ ){
                 if (num2[i]==(int)num1[j]){
					 sum++;
                 }
			}
			System.out.println((char)num2[i]+":"+sum);
        }
		//第三种
         int n2 = (int)(Math.random()*51+50);
		 char[] num3 = new char[n2];	
		 for (int i = 0;i<num3.length ;i++ ){
			  num3[i] = (char)(Math.random()*26+97);			
		 }
		 System.out.println(Arrays.toString(num3));
		 for (int i = 0;i<num3.length ;i++ ){
			 int count = 1;
			 boolean label = true;
			 for (int j = 0;j<i ;j++ ){
				 if (num3[i]==num3[j]){
                       label = false;
					   break;
				 }
			 }
			 if (!label){
				 continue;
			 }
			 for (int j=i+1;j<num3.length ;j++ ){
				 if (num3[i]==num3[j]){
					 count++;
				 }
			 }
			 System.out.println(num3[i]+":"+count);

		 }        
	}
}

 冒泡排序

/**
    冒泡排序
    {6,3,1,2,5,4}
第一轮:找到最大的元素 6
    6>3   true   {3,6,1,2,5,4}
	6>1   true   {3,1,6,2,5,4}
	6>2   true   {3,1,2,6,5,4}
	6>5   true   {3,1,2,5,6,4}
    6>4   true   {3,1,2,5,4,6}
第二轮:找到第二大的元素 5
    3>1   true   {1,3,2,5,4,6}
    3>2   true   {1,2,3,5,4,6}
	3>5   false  {1,2,3,5,4,6}
	5>4   true   {1,2,3,4,5,6}
第三轮:找到第三大的元素 4
    1>2   false  {1,2,3,4,5,6}
	2>3   false  {1,2,3,4,5,6}
	3>4   false  {1,2,3,4,5,6}
第四轮:找到第四大的元素 3
    1>2   false  {1,2,3,4,5,6}
	2>3   false  {1,2,3,4,5,6}
第五轮:找到第五大的元素 2
    1>2   false  {1,2,3,4,5,6}

--->外层控制轮数:
            范围:
			i=0;
			i<length-1
	内层控制每轮比较的次数:
	                  范围:
					  j=0;
					  j<length-1-i

*/
import java.util.Arrays;
public class ArrayDemo01{
	public static void main(String[] args){
	    int[] arr1 = {6,3,1,2,5,4};
		/*要求数组里的元素按照从小到大排序*/
		int a = 0;
		for (int i = 0;i<arr1.length-1 ;i++ ){
			 System.out.println("第"+(i+1)+"轮");
			 boolean f = true; //每一轮都定义一个开关
			 for (int j = 0;j<arr1.length-1-i ;j++) {
				 if (arr1[j]>arr1[j+1]){
					  int t = arr1[j];
					  arr1[j] = arr1[j+1];
					  arr1[j+1]= t;
					  f = false;//发生交换,修改开关状态
				 }
			   System.out.println(Arrays.toString(arr1));
			 }
			 //此轮结束,查看开关的状态
			 if (f){
				 //开关状态没变,说明已经完成了排序
				 //所以不用继续下一轮
				 break;
			 }
		}
		System.out.println("从小到大排序:"+Arrays.toString(arr1));
	}
}

简单排序

import java.util.Arrays;
public class TestDemo01{
	public static void main(String[] args){
	    int[] arr = {4,5,2,3,1};
        /*
		  冒泡排序的每一步详情;
		  第一轮:找最大值
		  4>5     false    {4,5,2,3,1}
		  5>2     true     {4,2,5,3,1}
		  5>3     true     {4,2,3,5,1}
		  5>1     true     {4,2,3,1,5}
		*/
		/*
		  简单选择排序;基本思路如下
		  原始数据{4,5,2,3,1}

		  找出最小1   与4交换   {1,5,2,3,4}
		  找出最小2   与5交换   {1,2,5,3,4}
		  找出最小3   与5交换   {1,2,3,5,4}
		  找出最小4   与5交换   {1,2,3,4,5}  
		
		*/
		for (int i = 0;i<arr.length-1 ;i++ ){
			System.out.println("第"+(i+1)+"轮");
			for (int j = 0;j<arr.length-1-i ;j++ ){
				if (arr[j]>arr[j+1]){
					int t = arr[j];
					 arr[j]=arr[j+1];
					 arr[j+1]=t;
				}
				System.out.println(Arrays.toString(arr));
			}
		}
		System.out.println(Arrays.toString(arr));
		System.out.println("--------------------------------------------");
        
		//简单排序
        int[] arr2 = {4,5,2,3,1};
		for (int i = 0;i<arr2.length-1 ;i++ ){
			 int min = arr2[i];               //假设arr2[i]是最小的
			 int index = -1;                 //记录每次最小值的下标
			 boolean f = false;             //定义一个标记
			 for (int j = i+1;j<arr2.length ;j++){
				  if (min>arr2[j]){
					  min = arr2[j];        //将较小值赋给min
					  index = j;           //同时记录下标
					  f = true;           //改变标记
				}
			}
             //内层结束
			 if (f){                    //查看标记,标记更改,说明需要交换
			      int t = arr2[i];
		          arr2[i]=arr2[index];
		          arr2[index]=t;
			}		    
		}
		System.out.println(Arrays.toString(arr2));				
		//
		int[] arr1 = {56,72,356,111,1};
		for (int i = 0;i<arr1.length ;i++ ){
			 for (int j = i+1;j<arr1.length ;j++ ){
				 if (arr1[i]>arr1[j]){
					 int t = arr1[j];
					 arr1[j]= arr1[i];
					 arr1[i]= t;
				}
			}
		}
		System.out.println(Arrays.toString(arr1));
	}
}

 工具类排序

import java.util.Arrays;
public class ArrayDemo02{
	public static void main(String[] args){
	    int[] arr1 = {5,3,2,4,1};
		System.out.println(Arrays.toString(arr1));
		//调用工具类的排序方法
		Arrays.sort(arr1);
		System.out.println(Arrays.toString(arr1));

		String[] names =
		       {"A","abc","bac","01","03","02"};
		//调用工具类的排序方面
		Arrays.sort(names);
		System.out.println(Arrays.toString(names));

	}
}

二维数组

/**
  二维数组的学习:
  概念:数组的元素依然时一个数组。
*/
import java.util.Arrays;
public class ArrayDemo01{
	public static void main(String[] args){
	    /*二维数组的声明和初始化*/

		/*静态初始化:*/
		int[][] a = {{1,2},{3,4,5},{6,7}};
		/*使用for循环进行遍历*/
		for (int i = 0;i<a.length ;i++ ){
			int[] n = a[i];
			//System.out.println(Arrays.toString(n));
			for (int j = 0;j<n.length ;j++ ){
				System.out.print(n[j]+" ");
			}
			System.out.println();
		}
        /*动态初始化
		  二维数组等长式初始化,需要考虑数组下标越界异常		
		*/
		int[][] b = new int[6][5];
		/*访问输出第一个数组*/
		System.out.println(Arrays.toString(b[0])); 
		b[0][0] = 1;
		          //b[0][6] = 7;越界
		System.out.println(Arrays.toString(b[0]));
		/*第二种动态初始化
		  只规定了高维的长度。
		  里面的元素是null,
		  不能直接进行赋值。

		  应该先把null替换成相应的数组对象

		  {{1,2},{1,2,3},null}
		*/
		int[][] c = new int[3][];
		//输出c的第一个元素
		System.out.println(c[0]);//输出:null---引用数据的默认值

		c[0] = new int[2];//将null替换成数组对象
		c[0][0] = 1;
		c[0][1] = 2;
		System.out.println(Arrays.toString(c[0]));

		c[1] = new int[3];
		c[1][1] = 4;
		System.out.println(Arrays.toString(c[1]));

		c[2] = new int[2];
		System.out.println(Arrays.toString(c[2]));
		
	}
}
import java.util.Scanner;
import java.util.Arrays;
public class TestDemo02{
	public static void main(String[] args){
	    /*录入10个学生的数学,语文,英语三科成绩
		  计算数学/语文/英语的平均成绩,
		  并找出每科成绩的最高分与最低分。
		*/
         Scanner sc = new Scanner(System.in);
		 double[][] score = new double[5][3];	
		 for (int i = 0;i<score.length ;i++ ){		 
			 System.out.println("录入第"+(i+1)+"个学生的数学/语文/英语成绩:");
			 for (int j = 0;j<score[i].length ;j++ ){                  
				  double input = sc.nextDouble();
				  score[i][j] = input;
			 }
		 }
		 //查看每个学生的成绩
		  for (int i = 0;i<score.length ;i++ ){
			  System.out.println(Arrays.toString(score[i]));
		  }
		//计算每科平均成绩
		String[] s = {"数学平均分:","语文平均分:","英语平均分:"};
		for (int i = 0;i<3;i++ ){
			 double sum = 0;
			 for (int j = 0;j<5 ;j++ ){
				  sum+= score[j][i];
			}		
			System.out.println(s[i]+sum/5);
		}
		//计算每个人的平均分
		for (int i = 0;i<5;i++ ){
			 double sum = 0;
			 for (int j = 0;j<3 ;j++ ){
				  sum+= score[i][j];  
			}
			System.out.println("第"+(i+1)+"个同学的平均成绩"+(int)((sum/3)*100)/100.0+" ");//平均分保留两位小数
		}
        //找出每科中的最高和最低分
		double[] min = new double[3];
		double[] max = new double[3];
		String[] s1 = {"数学最低分:","语文最低分:","英语最低分:"};
		String[] s2 = {"数学最高分:","语文最高分:","英语最高分:"};
		for (int i = 0;i<3 ;i++ ){
			 min[i]=101;
			 max[i]=1;
			for (int j = 0;j<score.length;j++ ){
				if (min[i]>score[j][i]){
					 min[i]=score[j][i];
	            }
				if (max[i]<score[j][i]){
					max[i]=score[j][i];
				}				 
			}
			System.out.println(s1[i]+min[i]);
			System.out.println(s2[i]+max[i]);
		}  
	}
}

猜你喜欢

转载自blog.csdn.net/zoe_ranxiaosu/article/details/81259994