数组排序和常用类

一.数组排序

1.选择排序:

  数组的0索引依次和后面的索引进行比较,对应的元素小的往前方法,依次比较,就可以得到一个排好序的数组
  规律:
             ① 选择排序:用0索引对应的元素依次和后面的索引对应的进行比较,小的往前放
             ② 用由0索引开始比较
                          1索引进行比较
                           ......
                           到最后依次:
                                                 arr.length-1索引和arr.length-2进行比较

1).直接比较

package Array1;

public class ArrayWork1 {
	public static void main(String[] args) {
		
		//定义一个数组,静态初始化
		int[] arr = {24,69,80,57,13} ;
		
		//排序前
		System.out.println("排序前:");
		printArray(arr) ;
		
		//第一次比较
		int x = 0 ;
		for(int y = x +1 ;y < arr.length ; y ++){
			//判断
			if(arr[y]<arr[x]){//后面的索引对应的元素小于前面索引对应的元素,互换
				//第三方变量
				int temp = arr[x] ;
				arr[x] = arr[y] ;
				arr[y] = temp ;
			}
		}
		
		System.out.println("第一次比较后:");
		printArray(arr) ;
		
		//第二次比较
		x = 1 ;
		for(int y = x +1 ;y < arr.length ; y ++){
			//判断
			if(arr[y]<arr[x]){
				int temp = arr[x] ;
				arr[x] = arr[y] ;
				arr[y] = temp ;
			}
		}
		System.out.println("第二次比较后:");
		printArray(arr) ;
		
		//第三次比较
		x = 2 ;
		for(int y = x +1 ;y < arr.length ; y ++){
			//判断
			if(arr[y]<arr[x]){
				int temp = arr[x] ;
				arr[x] = arr[y] ;
				arr[y] = temp ;
			}
		}
		System.out.println("第三次比较后:");
		printArray(arr) ;
		
		//第四次比较
		x = 3 ;
		for(int y = x +1 ;y < arr.length ; y ++){
			//判断
			if(arr[y]<arr[x]){
				int temp = arr[x] ;
				arr[x] = arr[y] ;
				arr[y] = temp ;
			}
		}
		System.out.println("第四次比较后:");
		printArray(arr);
			//遍历数组的功能
	public static void printArray(int[] arr){
		System.out.print("[");
		//遍历数组
		for(int x = 0 ; x < arr.length ; x ++){
			//判断是否最大索引
			if(x==arr.length-1){
				System.out.println(arr[x]+"]");
			}else{
				System.out.print(arr[x]+", ");
			}
		}
	}
}


2).利用循环改进


package Array1;

public class ArrayWork1 {
	public static void main(String[] args) {
		
		//定义一个数组,静态初始化
		int[] arr = {24,69,80,57,13} ;
		
		//排序前
		System.out.println("排序前:");
		printArray(arr) ;
		
	for(int x = 0 ;x < arr.length-1 ;x++){
			for(int y = x +1 ; y<arr.length ; y++){
				//判断
				if(arr[y]<arr[x]){
					int temp = arr[x] ;
					arr[x] = arr[y] ;
					arr[y] = temp ;
				}
			}
		}
		}
		
		//调用
		 selectSort (arr) ;
		System.out.println("排序后:");
		printArray(arr) ;
	}                               

	//遍历数组的功能
	public static void printArray(int[] arr){
		System.out.print("[");
		//遍历数组
		for(int x = 0 ; x < arr.length ; x ++){
			//判断是否最大索引
			if(x==arr.length-1){
				System.out.println(arr[x]+"]");
			}else{
				System.out.print(arr[x]+", ");
			}
		}
	}
}


3).将选择排序的代码封装成一个独立的功能


package Array1;


public class ArrayWork1 {
	public static void main(String[] args) {
		
		//定义一个数组,静态初始化
		int[] arr = {24,69,80,57,13} ;
		
		//排序前
		System.out.println("排序前:");
		printArray(arr) ;
		
			 selectSort (arr) ;
		System.out.println("排序后:");
		printArray(arr) ;
}                                                                                                                                                 
	public static void selectSort(int[] arr){
		for(int x = 0 ;x < arr.length-1 ;x++){
			for(int y = x +1 ; y<arr.length ; y++){
				//判断
				if(arr[y]<arr[x]){
					int temp = arr[x] ;
					arr[x] = arr[y] ;
					arr[y] = temp ;
				}
			}
		}
	}
	
	//遍历数组的功能
	public static void printArray(int[] arr){
		System.out.print("[");
		//遍历数组
		for(int x = 0 ; x < arr.length ; x ++){
			//判断是否最大索引
			if(x==arr.length-1){
				System.out.println(arr[x]+"]");
			}else{
				System.out.print(arr[x]+", ");
			}
		}
	}
}


2.二分查找

之前查找元素第一次在数组中出现的索引,基本查找法(从头查到尾)
        二分查找:针对数组一定有序的!
  
  定义一个数组:
   11,22 ,33 ,44 ,55 ,66 ,77 
  
  步骤:
         (1) 有一个排好序的数组
         (2) 定义最小索引和最大索引
         (3) 计算中间索引
         (4) 拿中间索引对应的元素和要查的元素进行比较
                           相等:直接返回中间索引
                           不相等:
                                        大了,左边找
                                        小了,右边找
         (5) 重新获取最小索引和最大索引
                                        大了,左边找
                                                 int max=mid-1;
                                        小了,右边找
                                                 int min=mid+1;
         (6) 重新计算中间索引(回到第四步)继续查找!


public class ArrayWork2 {
	public static void main(String[] args) {
		//定义一个数组,静态初始化
		int[] arr = {23,32,41,49,51,72,96} ;
		
		//需求:查找72元素对应的索引
		int index = getIndex(arr, 72) ;
		System.out.println("index:"+index);
		
		//需求:要查找333元素对应的索引
		//如果查找的这个元素在数组中查不到呢?
		int index2 = getIndex(arr, 987) ;
		System.out.println("index2:"+index2);
	}
	
	/**
	 * 两个明确:
	 * 	明确返回值类型:int类型
	 * 明确参数类型,几个参数:int[] arr,int value
	 */
	public static int getIndex(int[] arr,int value){
		//定义最大索引和最小索引
		int max = arr.length -1 ;
		int min = 0 ;
		
		
		//计算中间索引
		int mid = (max + min)/2 ;
		
		//拿中间索引对应的元素和要查找的value元素进行比较
		while(arr[mid] !=value){
			//当前mid索引对应的元素不等于value元素,分两种情况
			if(arr[mid]>value){
				//重新获取最大索引
				 max = mid -1 ;
			}else if(arr[mid]<value){
				min = mid +1 ;
			}
			
			//如果找不到了应该返回-1
			//判断
			if(min>max){
				return -1 ;
			}
			
			//重新获取最大和最小索引,计算中间索引
			mid = (max+min)/2 ;
			
		}
		return mid ; //如果直接相等,直接返回
	}
}

二.日历类

Calendar:日历类:
  Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,
   并为操作日历字段(例如获得下星期的日期)提供了一些方法
Calendar 该类是一个抽象类:不能实例化的,所以通过一下这个方法来创建对象
public static Calendar getInstance()
   public int get(int field)返回给定日历字段的值
  
   public static final int YEAR: 表示日历中 的年
   public static final int MONTH: 月份:是0开始计算的
   public static final int DATE:和DAY_OF_MONTH是同义词,表示月份中的某天

public class CalendarText {
	
	public static void main(String[] args) {
		// 创建日历类对象
		Calendar calendar = Calendar.getInstance(); //创建日历类对象,需要通过getInstance()方法创建对象
		// 获取年
		// public static final int YEAR
		int year = calendar.get(Calendar.YEAR);

		// 获取:年中的月份
		// public static final int MONTH
		int month = calendar.get(Calendar.MONTH);

		// 获取月份中的天
		// public static final int DATE
		int date = calendar.get(Calendar.DATE);
		
		//输出
		System.out.println(year+"年"+(month+1)+"月"+date+"日");


三.日期类


Date类:日期类:
   表示特定的瞬间,精确到毫秒。
  
   常用的构造方式:
   public Date():表示分配的一个Date对象:无参: 通过无参构造获取当前系统的具体的时间
   public Date(long date):指定一个时间毫秒值  和它1970-1-1 00:00:00有时间差

package DATE;

import java.sql.Date;

public class DateDemo {
	public static void main(String[] args) {
		
		//创建日期对象
		Date d = new Date(0) ;
		
		//输出日期对象
		System.out.println("d:"+d);//  d:Thu Jan 01 08:00:00 CST 1970: 获取当前系统的年月日以及时分秒 星期
		
		//设置一个时间long
		long time = 1000/60/60 ;
		Date d2 = new Date(time) ;
		System.out.println("d2:"+d2);
		
	}
}








Date中的两个成员方法
   public long getTime():获取当前时间毫秒值
  
  如果知道Date对象,可以通过getTime()获取时间毫秒值
             public void setTime(long time)

public class DateDemo2 {
	
	public static void main(String[] args) {
		//创建一个日期对象
		Date d = new Date() ;
		System.out.println(d);
		
		//public long getTime():获取当前时间毫秒值
		long time = d.getTime() ;
//		System.out.println(time);
		
//		System.out.println(System.currentTimeMillis());//通过System可以获取当前时间的毫秒数
		
		//public void setTime(long time)
		d.setTime(1000) ;
		System.out.println(d);
	}
}



将Date对象--->String类型的日期的"文本格式":格式化
 * public final String format(Date date)
 * String类型日期的"文本格式"---->Date日期对象:解析
 * public Date parse(String source) 该方法本身会抛出一个异常:ParseException(解析异常:编译时期异常)
 * 
 * 要进行转换:必须使用中间桥梁:DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。
 * 日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期Date -> 文本String)、解析(文本String-> 日期Date)和标准化
 * 
 * 但是,DateFormat是抽象类,不能直接实例化,使用的是它更具体的子类进行实例化:
 * SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类
 * 
 * 常用的构造方法:
 * Date---格式化--->String文本格式
 *
 * public SimpleDateFormat(String pattern)用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat
 * 
 * 日期和时间模式
 * y 比如:2017---->yyyy
 * M 年中的月份:2------>MM
 * d   月份中的天数 :----->dd
 * H 小时HH
 * m 小时中的分钟数mm
 * s 分钟中的秒数ss


package DATE;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormatDemo {
	
	public static void main(String[] args) throws ParseException {
		
		//Date日期对象--->格式化---->String:日期文本格式
		//创建日期对象
		Date d = new Date() ;
//		System.out.println(d);
		
		//创建SimpleDateFormat类对象,用该对象格式化Date对象
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
		//格式化
		//public final String format(Date date)
		String dateStr = sdf.format(d) ;
		System.out.println("dateStr:"+dateStr);
		
		System.out.println("-----------------------");
		
		//String日期"文本格式"----->解析----->Date对象
		/**
		 * 注意事项:
		 * 		一定要保证SimpleDateFormat中的String Pattern这个模式和当前给的字符串的文本格式的模式必须一致!
		 */
		String s = "2017-12-30" ;
		
		//创建SimpleDateFormat类的对象,用该对象解析String的日期的"文本格式"
//		SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日") ;
		SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd") ;
		//ava.text.ParseException: Unparseable date: "2017-12-30"
		//开始解析
		//public Date parse(String source)
		
		Date d2 = sdf2.parse(s);

		System.out.println("d2:"+d2);
	}
}



四.system类


System:该类没有构造方法,所以字段和成员方法都用静态修饰
  
   常用的两个字段:
   in ,out都和流有关系:java.io...
  
   PrintStream(字节打印流) ps = System.out ; 标准输出流
   PrintWriter(字符打印流)
  
   InputStream  in =  System.in; 标准输入流
  
   常用的成员方法:
   public static void gc()运行垃圾回收器。 
调用 gc 方法暗示着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存,最终调用的就是重写之后finalize()回收不用
的对象!
public static void exit(int status)终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。
public static long currentTimeMillis():返回当前的时间毫秒值


public class SystemDemo {
	public static void main(String[] args) {
		//输出语句
		/*System.out.println("电子竞技没有爱情");
		
		//调用exit()方法
		System.exit(0) ;//JVM已经退出了,还可结束循环语句,调用该方法Jvm都退出了,所以循环也就结束了
		
		System.out.println("我们不一样"");*/
		
		//单独使用
//		long time = System.currentTimeMillis() ;//获取当前系统时间毫秒值
//		System.out.println(time);
		//currentTiimeMillis():单独使用没意义
		//需求:计算某一个应用程序的耗时的毫秒数
		long start = System.currentTimeMillis() ;
		//for循环
		for(int x = 0 ; x <100000;x ++){
			System.out.println("hello"+x);
		}
		
		long end = System.currentTimeMillis() ;
		
		System.out.println("当前for循环语句共耗时:"+(end-start)+"毫秒");//当前for循环语句共耗时:2621毫秒
 	}
}





System里面的常用的成员方法:
   public static void arraycopy(Object src,int srcPos,Object dest, int destPos,int length)
   指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束


package system;

import java.util.Arrays;

public class SystemDemo2 {
	
	public static void main(String[] args) {
		//定义两数组,静态初始化
		int[] arr1 = {12,31,42,58,72,99} ;
		int[] arr2 = {3,4,5,6,7,8,9} ;
		
		//复制数组
		System.arraycopy(arr1, 2, arr2, 1, 2) ;
		
		//分别将arr1 和arr2数组以字符串形式显示出来
		System.out.println("arr1:"+Arrays.toString(arr1));
		System.out.println("arr2:"+Arrays.toString(arr2));
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值