选择排序-二分查找-Arrays-System-BigDecimal-BigInteger-Date-Calendar-Math

一.选择排序

1.思想:从0索引开始,用它对应的元素依次和后面索引对应的元素进行比较,小的往前放,第一次比较完毕,最小值出现在了最小索引处,依次这样比较,就可以得到一个从小到达排好序的数组。

package day_12_11_6.sort;

public class SelectSort {
	
	public static void main(String[] args) {
		// 定义并初始化一个数组
		int arr[] = {12,3,6,4,1};
		//打印数组
		System.out.println("排序前:");
		printArray(arr);
		//选择排序
		selectSort(arr);
		System.out.println("排序后:");
		printArray(arr);
	}
	
	//打印数组的功能
	public static void printArray(int [] arr){
		System.out.print("[");
		//遍历数组
		for(int i=0;i<arr.length;i++){
			
			//判断是否是最大索引
			if(i==arr.length-1){
				System.out.println(arr[i]+"]");
			}else{
				System.out.print(arr[i]+", ");
			}
		}
		
	}
	//选择排序
	public static void selectSort(int [] arr){
		for(int i=0;i<arr.length-1;i++){	   //排序的次数
			for(int j=i+1;j<arr.length;j++){   //
				//判断,后面的索引对应的元素小于前面索引对应的元素,互换
				if(arr[j]<arr[i]){
					int temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
		}
		
	}
}

二.二分查找

前提条件:数组必须是有序的(即是一个排好序的数组)

思想:猜想中间索引,这样可以将数组减半

步骤:1)一个排好序的数组                                                                                                                                                                2)定义最小索引和最大索引

   3)计算中间索引 int mid = (min+max)/2
   4)拿中间索引对应的元素和要查找的元素进行比较,相等,直接返回中间索引。不相等:大了左边找。小了:右边找
           5)重新获得最小索引和最大索引,大了:int max = mid-1;小了:int min = max+1
           6)回到4)继续找
package day_12_11_6.sort;
/**
 * 定义一个排好序的数组:
 * 			11,22 ,33 ,44 ,55 ,66 ,77 
 * 查找22元素对应的索引
 * */
public class BinSort {
	public static void main(String[] args) {
		
		// 定义一个数组并静态初始化
		int [] arr = {11,22,33,44,55,66,77};
		
		//需求:查找元素22对应的索引
		int index = getIndex(arr,22);
		System.out.println("index = "+index);

	}
	/**
	 * 两个明确:
	 * 明确返回值类型: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;
		
		//中间索引对应的元素和要查找的元素进行比较,不知道比较的次数,用while循环
		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;		
	}
}
练习:假设有一个数组,int arr [24,69,80,57,13] ,查找80这个元素在数组中的索引
分析:经过排序算法排序后,数组的索引已经发生变化了,所以遇到这种情况,就不要使用二分查找,就是用最基本的查找方法(从头查到尾)
public class InsSort {
	public static void main(String[] args) {
		// 定义一个数组并初始化
		int [] arr = {24,69,80,57,13};
		
		//调用获取索引的方法
		int index = getIndex(arr,80);
		System.out.println("index = "+index);
		
	}
	public static int getIndex(int [] arr,int value){
		//假设法:定义一个索引:假设查不到
		int index = -1;
		//遍历数组
		for(int i=0;i<arr.length;i++){
			//判断:如果刚好查到的i索引对应的元素和value相等,那么返回该索引
			if(arr[i]==value){
				//表示查到了,给索引重新赋值
				index = i;
				break;
			}
		}
		return index;
	}		
}

三.数组工具类Arrays

1.常用方法:

1)public static String toString(int[] a):将任意类型的数组以字符串形式显示出来!
2)public static void sort(int[] a):快速排序:(将给定数组中元素升序排序)
3)public static int binarySearch(int[] a, int key):当前int数组一定是有序数组,使用二分搜索法来搜索指定的 int 型数组,以获得指定的值
public class ArraysDemo {

	public static void main(String[] args) {
		// 定义一个数组
		int[] arr = {24,69,80,57,13};
		//将数组转换成字符串的形式
		/**
		 * 1.public static String toString(int[] a):将任意类型的数组以字符串形式显示出来!
		 * */
		System.out.println("toString():"+Arrays.toString(arr));  //[24, 69, 80, 57, 13]
		
		
		/**
		 * 2.public static void sort(int[] a):快速排序:(将给定数组中元素升序排序)
		 * */
		Arrays.sort(arr);
		//再调用Arrays.toString(int[] a)将排好序的数组以String形式显示出来
		System.out.println("sort():"+Arrays.toString(arr));  //[13, 24, 57, 69, 80]
		
		/**
		 * 3.public static int binarySearch(int[] a, int key):
		 * */
		System.out.println("binarySearch(int[] a, int key):"+Arrays.binarySearch(arr, 69));//3
	}

}
练习:字符串中的字符进行排序。举例:"dacgebf",结果:"abcde

public class ArraysTest {

	public static void main(String[] args) {
		// 创建键盘录入对象
		Scanner sc = new Scanner(System.in);
		
		//录入并接收字符串
		System.out.println("请输入字符串:");
		String s = sc.nextLine();
		
		//将字符串转换成字符数组
		char[] chs = s.toCharArray();
		//对字符数组调用Arrays类sort()方法进行排序
	    Arrays.sort(chs);
	    //将字符数组转换成字符串
	    //方法1:
	    String result = String.valueOf(chs);
	    //方法2:
	    //String result = Arrays.toString(chs);
	    System.out.println("result:"+result);

	}
}
四.BigDecimal类

1.概述:对于浮点类型的数据来说,他们的存储和整数的存储是不一致的,是按照有效数字位来进行存储的,浮点类型的数据计算的时候容易损失精度,计算出来的结果不精确,Java针对 这个情况,提供BigDecimal。

作用:来提供浮点类型数据的精确计算!可变的、任意精度的有符号十进制数

构造方式:public BigDecimal(String val)
成员方法:
1)public BigDecimal add(BigDecimal augend):加
2)public BigDecimal subtract(BigDecimal subtrahend):减
3)public BigDecimal multiply(BigDecimal multiplicand):乘法
4)public BigDecimal divide(BigDecimal divisor):除
5)public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)参数1:除数,参数2:保留几位小数,参数3:舍入的一种模式:ROUND_HALF_UP
package day_12_11_6.BigDecimal;

import java.math.BigDecimal;

public class BigDecimalDemo {
	public static void main(String[] args) {
		/*System.out.println(1.0-0.32);		//0.6799999999999999
		System.out.println(0.01+0.09);		//0.09999999999999999
		System.out.println(1.501*100);		//150.1
		System.out.println(1.031/100);		//0.01031
		*/	
		//创建BigDecimal对象
		BigDecimal bd1 = new BigDecimal("0.01") ;
		BigDecimal bd2 = new BigDecimal("0.09") ;
				
		//public BigDecimal add(BigDecimal augend):加
		System.out.println("add:"+bd1.add(bd2));
				
		BigDecimal bd3 = new BigDecimal("1.0") ;
		BigDecimal bd4 = new BigDecimal("0.32") ;
				
		//public BigDecimal subtract(BigDecimal subtrahend):减
		System.out.println("sub:"+bd3.subtract(bd4));//0.68
				
		//public BigDecimal multiply(BigDecimal multiplicand):乘法
		BigDecimal bd5 = new BigDecimal("1.501") ;
		BigDecimal bd6 = new BigDecimal("100.0") ;
		System.out.println("mul:"+bd5.multiply(bd6));
				
		//public BigDecimal divide(BigDecimal divisor):除
		BigDecimal bd7 = new BigDecimal("1.301") ;
		BigDecimal bd8 = new BigDecimal("100") ;
				
		System.out.println("div:"+bd7.divide(bd8));
		//public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)
		//参数1:商,	参数2:保留几位小数,参数3:舍入的一种模式:ROUND_HALF_UP
				
	       System.out.println("div:"+bd7.divide(bd8, 3, BigDecimal.ROUND_HALF_UP));
	       System.out.println("div:"+bd7.divide(bd8, 8, BigDecimal.ROUND_HALF_UP));	
	}
}

五.BigInteger类:

1.概述:用来计算超出了Integer类型范围的数据。
2.构造方式:public BigInteger(String var):将字符串封装成BigInteger类型
package day_12_11_6.BigInteger;

import java.math.BigInteger;

public class BigIntegerDemo {

	public static void main(String[] args) {
		// 查看Integer类的最大值
		System.out.println(Integer.MAX_VALUE);//2147483647

		/*//创建Integer对象
		Integer i = new Integer("2147483648");
		System.out.println(i);		//java.lang.NumberFormatException: For input string: "2147483648",数据超出Integer范围
		*/
		//创建BigInteger对象
		BigInteger bi = new BigInteger("2147483648");
		System.out.println(bi);
	}

}

3.成员方法:

1)public BigInteger add(BigInteger val)
2)public BigInteger subtract(BigInteger val)
3)public BigInteger multiply(BigInteger val)
4)public BigInteger divide(BigInteger val)
5)public BigInteger[] divideAndRemainder(BigInteger val):返回一个BigInteger数组,数组中的元素:商,余数
package day_12_11_6.BigInteger;
import java.math.BigInteger;
public class BigIntegerDemo2 {

	public static void main(String[] args) {
		// 创建BigInteger对象
		BigInteger b1 = new BigInteger("100");
		
		BigInteger b2 = new BigInteger("50");
		System.out.println("add:"+b1.add(b2));
		System.out.println("subtract:"+b1.subtract(b2));
		System.out.println("multiply:"+b1.multiply(b2));
		System.out.println("divide:"+b1.divide(b2));
		
		BigInteger[] datas = b1.divideAndRemainder(b2);
		System.out.println("divideAndRemainder:"+datas[0]);
		System.out.println("divideAndRemainder:"+datas[1]);
	}
}

六.System类

1.概述:该类没有构造方法,所以字段和成员方法都用静态修饰

常用的两个字段:in out都和流有关系:java.io
PrintStream(字节打印流)   ps = System.out; 标准输出流(写数据)
PrintWriter(字节打印流)    
InputStream in = System.in:标准输入流(读数据)
2.常用的成员方法:
1)public static void gc()运行垃圾回收器:调用 gc 方法暗示着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存,最终调用的就是重写之后finalize()回收不用的对象!
package day_12_11_6.system;

public class SystemDemo {
	public static void main(String[] args) {
		// 创建Person对象
		Person p = new Person("高圆圆",27);
		System.out.println(p);
		p = null;	//当前Person变成空了,没有更多的引用了
		//启动垃圾回收器
		System.gc();//当前垃圾回收器需要回收不用对象了Person [name=高圆圆, age=27]
	}
}
package day_12_11_6.system;

public class Person {
	
		private String name;
		private int age;
		
		public Person() {
			super();
			// TODO Auto-generated constructor stub
		}
		
		public Person(String name, int age) {
			super();
			this.name = name;
			this.age = age;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public int getAge() {
			return age;
		}

		public void setAge(int age) {
			this.age = age;
		}

		@Override
		public String toString() {
			return "Person [name=" + name + ", age=" + age + "]";
		}		
}
2)public static void arraycopy(Object src,int srcPos,Object dest, int destPos,int length)
指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束
package day_12_11_6.system;

import java.util.Arrays;
public class SystemDemo2 {
	public static void main(String[] args) {
		// 定义两数组,静态初始化
		int [] arr1 = {11,22,33,44,55};
		int [] arr2 = {1,2,3,4,5};
		
		//复制数组
		System.arraycopy(arr1, 1, arr2, 2, 3);
		
		//分别将arr1 和arr2数组以字符串形式显示出来
		System.out.println("arr1:"+Arrays.toString(arr1));
		System.out.println("arr2:"+Arrays.toString(arr2));
	}
}
3)public static void exit(int status)终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。
4)public static long currentTimeMillis():返回当前的时间毫秒值
package day_12_11_6.system;

public class SystemTest {

	public static void main(String[] args) {
		//输出语句
		System.out.println("I want to travel!");

		//调用exit()方法
		//System.exit(0);  //JVM已经退出了,还可结束循环语句,调用该方法Jvm都退出了,所以循环也就结束了
		System.out.println("but you must have enough money!");
		
		//单独使用
		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循环语句共耗时:1556毫秒	
	}
}

七.Calender类(日历类):

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

package day_12_11_6.calendar;
import java.util.Calendar;
public class CalendarDemo {

	public static void main(String[] args) {
		//创建日历对象
		Calendar c = Calendar.getInstance();
		//获取年
		int year = c.get(Calendar.YEAR);
		//获取月
		int month = c.get(Calendar.MONTH);
		//获取日
		int date = c.get(Calendar.DATE);
		
		System.out.println(year+"年"+(month+1)+"月"+date+"日");
	}
}

5.成员方法:
public abstract void add(int field,int amount):为给定的日历的字段添加或者减去时间偏移量 
public final void set(int year,int month,int date):设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值
package day_12_11_6.calendar;

import java.util.Calendar;
public class CalendarDemo2{
	public static void main(String[] args) {
		// 创建日历类对象
		Calendar c = Calendar.getInstance();
		
		//获取年
		int year = c.get(Calendar.YEAR);
		//获取月
		int month = c.get(Calendar.MONTH);
		//获取月中的天
		int date = c.get(Calendar.DATE);
		System.out.println(year+"年"+(month+1)+"月"+date+"日");
		
		
		//public abstract void add(int field,int amount)
		c.add(Calendar.YEAR, -3);
		//获取年
		 year = c.get(Calendar.YEAR);
		//获取月
	     month = c.get(Calendar.MONTH);
		//获取月中的天
		 date = c.get(Calendar.DATE);
		System.out.println(year+"年"+(month+1)+"月"+date+"日");
		
		//需求:十年后的五天前
		c.add(Calendar.YEAR, 10);
		c.add(Calendar.DATE, -5);
		//获取年
		 year = c.get(Calendar.YEAR);
		//获取月
	     	month = c.get(Calendar.MONTH);
		//获取月中的天
		 date = c.get(Calendar.DATE);
		System.out.println(year+"年"+(month+1)+"月"+date+"日");
		
		//public final void set(int year, int month, int date)
		c.set(2018, 5, 10);
		//获取年
		 year = c.get(Calendar.YEAR);
		//获取月
	     	month = c.get(Calendar.MONTH);
		//获取月中的天
		 date = c.get(Calendar.DATE);
		System.out.println(year+"年"+(month+1)+"月"+date+"日");	
	}
}
练习:键盘录入一个年份,获取任意一年的二月有多少天
package day_12_11_6.calendar;

import java.util.Calendar;
import java.util.Scanner;

public class CalendarTest {

	public static void main(String[] args) {
		// 创建键盘录入对象
		Scanner sc = new Scanner(System.in);
		
		//录入并接收数据
		System.out.println("请输入一个年份");
		int year = sc.nextInt();
		
		//创建日历类对象
		Calendar c = Calendar.getInstance();
		
		//设置日历的字段,年,月,日
		c.set(year, 2, 1);//其实月份:(month+1):3月1
		//将时间往前推算一天
		c.add(Calendar.DATE, -1);
		System.out.println(year+"年2月有:"+c.get(Calendar.DATE));
	}
}

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

import java.util.Date;

public class DateDemo {

	public static void main(String[] args) {
		// 创建日期对象
		Date d = new Date();
		
		//输出日期对象
		System.out.println("d:"+d);//Mon Nov 06 20:01:33 GMT+08:00 2017
		
		//设置一个时间long
		long time = 1000/60/60;
		Date d2 = new Date(time);
		System.out.println("d2:"+d2);//Thu Jan 01 08:00:00 GMT+08:00 1970

	}
}

3.成员方法

1)public long getTime():获取当前时间毫秒值:如果知道Date对象,可以通过getTime()获取时间毫秒值
2)public void setTime(long time)
package day_12_11_6.date;

import java.util.Date;

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);
	}
}

九.日期工具类

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

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

public class DateUtil {
	//将无参构造私有化,为了不让外界创建对象
	private DateUtil() {
		
	}
	/**
	 * Date--->String格式化
	 * */
	public static String dateToString(Date d,String format){
		//创建SimpleDateFormat对象
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		//格式化
		String str = sdf.format(d);
		return str;
	}
	/**
	 *将String的日期"文本格式"解析成一个Date日期对象
	 * @throws ParseException 
	 * */
	public static Date stringToDate(String s,String format) throws ParseException{
		//SimpleDateFormat对象
		SimpleDateFormat sdf = new SimpleDateFormat(format) ;
		Date date = sdf.parse(s);
		return date;
	}
	
}
package day_12_11_6.date;

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

public class DateUtilDemo {

	public static void main(String[] args) throws ParseException {
		// Date--->String
		//创建一个Date对象
		Date d = new Date();
		
		//调用格式化功能
		String str = DateUtil.dateToString(d, "yyyy-MM-dd HH:mm:ss");
		System.out.println("str:"+str);
		
		//String str2 = DateUtil.dateToString(d, "yyyy-MM-dd");
		//System.out.println("str2:"+str2);
		
		//String--->Date
		//模式要和字符串文本格式一致
		String s = "2018-10-1 12:34:56";
		//调用功能
		Date date = DateUtil.stringToDate(s, "yyyy-MM-dd HH:mm:ss");
		System.out.println("date:"+date);
	}

}

练习:键盘录入你的出生年月日,计算你来到这个世界有多少天了?
package day_12_11_6.date;

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

public class MyLifeTest {

	public static void main(String[] args) throws ParseException {
		// 创建键盘录入对象
		Scanner sc = new Scanner(System.in);
		//录入并接收数据
		System.out.println("请输入出生年月日:yyyy-MM-dd");
		String s = sc.nextLine();
		
		//使用DateUtil工具类
		Date date = DateUtil.stringToDate(s, "yyyy-MM-dd");
		//获取出生年月的时间毫秒值
		long oldTime = date.getTime();
		
		//获取当前系统的时间毫秒值
		long newTime = System.currentTimeMillis();
		
		long time = newTime - oldTime;
		//将毫秒值换算成天
		long day = time/1000/60/60/24;
		//输出
		System.out.println("你已出生"+day+"天啦");
	}
}
十.Math类
常用的成员方法:
1.public static int abs(int a):绝对值
2.public static double ceil(double a):向上取整
3.public static double floor(double a):向下取整
4.public static double max(double a,double b):获取最大值
5.public static double min(double a,double b):获取最小值
6.public static double pow(double a,double b):a的b次幂
7.public static double random():取值范围:[0.0,1.0)
8.public static long round(double a):四舍五入
9.public static double sqrt(double a):一个数的正平方跟
package day_12_11_6.math;

public class MathDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(Math.abs(-100));
		
		//public static double ceil(double a):向上取整
		System.out.println("ceil:"+Math.ceil(12.34));//13.0
		System.out.println("ceil:"+Math.ceil(12.54));//13.0
		
		//public static double floor(double a):向下取整	
		System.out.println("floor:"+Math.floor(12.34)); //12.0
		System.out.println("floor:"+Math.floor(12.56)); //12.0
		
		//public static double max(double a,double b):获取最大值
		System.out.println("max:"+Math.max(Math.max(10,20),30));
		
		//public static double pow(double a,double b):a的b次幂
		System.out.println("pow:"+Math.pow(2, 3));
		
		//public static long round(double a):四舍五入
		System.out.println("round:"+Math.round(12.56));//13
		
		//public static double sqrt(double a):一个数的正平方跟
		System.out.println("sqrt:"+Math.sqrt(4));
		
		//public static double random():取值范围:[0.0,1.0)
		System.out.println("random:"+(int)(Math.random()*10));
		
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值