Java数组学习笔记(遍历、排序、多维数组、命令行参数)

数组的遍历和快速打印

一、数组的遍历

数组的遍历有两种方法,一种是使用for循环,另一种是使用for each。

for each的基本使用方法为:

for (int element:ns) {
  System.out.println(element);							// element直接返回ns数组里面的元素
}	

需要注意的是:

  1. 使用for each看起来更加简洁
  2. 但是在使用for each的时候,是不能得到数组的索引的
  3. 返回类型诸如int容易遗漏

二、数组的快速打印

数组的打印也有两种方法,一种是使用for循环或者for each挨个打印元素,另一种是转换成字符串直接打印。

转换成字符串直接打印看起来更加简洁,需要使用到方法Arrays.toString(),使用方法之前需要import java.util.Arrays,这个编译器会自动帮你生成。

import java.util.Arrays;									// 导入标准库函数
System.out.println(Arrays.toString(ns));	// 转化成字符串打印输出

需要注意的是:

  1. 如果是使用ns.toString()返回的是字符串的地址

  2. 只有使用Arrays.toString(ns)返回的才是字符串本身

  3. 数组在转换成字符串在打印的时候,不会自动添加换行

三、代码案例

import java.util.Arrays;

public class ArrayOperation {
	public static void main(String[] args) {
//		新建一个数组
		int[] ns = {1,4,9,16,25};
		
//		1,使用for循环遍历数组
		for (int i=0;i<ns.length;i++){
			System.out.println(ns[i]);
		}
		
//		2,使用for each 遍历数组
//		for each循环更加简洁,但是拿不到下标索引
//		这里的element不是一个索引!
//		这里的element相当于一个迭代器,从ns[]这个数组里面挨个提取内容
		for (int element:ns) {
			System.out.println(element);
		}
		
//		3,快速打印数组里面的内容
//		要想快速打印数组里面的内容,需要把数组转变成字符串
//		Java标准库里面提供了这种方法:Arrays.toString()
//		3.1 注意这个写法是错误的,将会返回字符串的引用地址!
		System.out.println(ns.toString());
//		3.2 这个写法才能返回字符串里面的内容
		System.out.println(Arrays.toString(ns));	
		
	} 
}

冒泡排序和快速排序

一、冒泡排序

数组冒泡排序最容易错的有两点:

  1. 数组本身是一个引用,所以必须直接改变数组本身的引用关系,否则是不会对值产生改变的。
  2. 冒泡排序的第二层循环变量范围,应该是[左边第一个未排序,右边最后一个排好序]的下标。

数组冒泡排序的核心代码

for (int i=0;i<ns.length-1;i++) {
  for (int j=1;j<ns.length-i;j++) {
    // 开始比较大小,小的在前,大的在后
    if (ns[j-1]>ns[j]) { // 进行交换
      int temp = ns[j-1]; ns[j-1] = ns[j]; ns[j] = temp;		
    } }	}
System.out.println(Arrays.toString(ns));

二、快速排序

Java标准库内置了一个Arrays.sort()方法,可以直接调用

三、代码示例

这里面包含了自己身上犯的两个常见错误

import java.util.Arrays;

public class ArrayOperation {
	public static void main(String[] args) {
//		新建一个数组
		int[] ns = {28, 12, 89, 73, 65, 18, 96, 50, 8, 36};	
		
//		1, 练习冒泡排序
		for (int i=0;i<ns.length-1;i++) {
			for (int j=i+1;j<ns.length;j++) {
				int left = ns[j-1];
				int right = ns[j];
//				进行排序,小的在前,大的在后
				if (left>right){
//					交换大小
					int temp = left;
					left = right;
					right = temp;
				} //end if
			} // end for j
		} // end for i
//		你会惊讶地发现,数组没有发生任何改变!
//		怎么回事?
//		因为数组的本质是引用
		System.out.println(Arrays.toString(ns));
		//[28, 12, 89, 73, 65, 18, 96, 50, 8, 36]
    
//		2, 重来冒泡排序
		for (int i=0;i<ns.length-1;i++) {
			for (int j=i+1;j<ns.length;j++) {
//				开始比较大小,小的在前,大的在后
//				直接使用数组下标索引试试看
				if (ns[j-1]>ns[j]) {
//					进行交换
					int temp = ns[j-1];
					ns[j-1] = ns[j];
					ns[j] = temp;		
				} //end if
			}//end for j
		}//end for i
//		你会惊讶地发现,仍然出错了,咋回事?
//		想象一下,大的泡泡一直往后冒,所以最后一个元素是确定的
//		所以第二层遍历应该是从最左边到排好序的那个元素,
//		即j的范围应该是[1,ns.length-i]
		System.out.println(Arrays.toString(ns));
    //12, 28, 18, 50, 8, 36, 65, 73, 89, 96]
		
//		3, 再来冒泡排序
		for (int i=0;i<ns.length-1;i++) {
			for (int j=1;j<ns.length-i;j++) {
//				开始比较大小,小的在前,大的在后
				if (ns[j-1]>ns[j]) {
//					进行交换
					int temp = ns[j-1];
					ns[j-1] = ns[j];
					ns[j] = temp;		
				} //end if
			}//end for j
		}//end for i
		System.out.println(Arrays.toString(ns));
    //[8, 12, 18, 28, 36, 50, 65, 73, 89, 96] 成功!
		
//		4,使用系统自带的排序方法
		ns = new int[] {23,45,67,89,10};
		Arrays.sort(ns);
		System.out.println(Arrays.toString(ns));
    // [10, 23, 45, 67, 89]
	} 
}

数组和字符串排序的区别

  1. 对数组的排序,修改了数组本身的顺序

  2. 对字符串数组的排序,实际上修改的是引用(指向)的关系


在这里插入图片描述

多维数组建立和输出

1,多维数组的新建使用int[][]类型

2,多维数组使用.length()方法得到的长度和实际长度是不一样的,其本质是一维数组的嵌套

3,多维数组的打印使用Arrays.deepToString()这个函数

import java.util.Arrays;

public class ArrayOperation {
	public static void main(String[] args) {
//		多维数组
//		新建的时候需要注意返回类型是int[][]
		int[][] new_ns = {
	            { 1, 2, 3, 4 },
	            { 5, 6, 7, 8 },
	            { 9, 10, 11, 12 }
	        };
		System.out.println(new_ns.length);		//3
		System.out.println(new_ns[0].length);	//4
//		多维数组的打印输出使用deepToString这个函数
		System.out.println(Arrays.deepToString(new_ns));
	} 
}

命令行向main()传递参数

  1. main函数是可以引入字符串变量的,通过不同的字符串变量可以得到不同的结果,例如查询版本号。

  2. main函数的变量是在运行时候传递的,所以这里使用命令行进行编译运行。

  3. 使用Arrays.equals()判断两个字符串是否相等

首先在终端中新建一个文件

touch ArrayArgs.java			# 注意和public class后面的类名保持一致
open -e ArrayArgs.java

然后在里面填写下面的函数

public class ArrayArgs{
	public static void main(String[] args){
		System.out.println("test if is ok");
		for (String arg:args){
			if ("-version".equals(arg)){						// Array.equals()函数判断字符串是否相等
				System.out.println("Version: v1.0");
        break}// end if
		}// end for
	}// end main
}// end class

最后编译运行

javac ArrayArgs.java	
java  ArrayArgs.java	-version
# 效果如下 
test if is ok
Version: v1.0

参考文章

https://www.liaoxuefeng.com/wiki/1252599548343744/1255945064769408

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值