java个人学习笔记05(进制装换+排序查找+二维数组)

1.前面所学知识的综合应用:

/*需求:综合上一版十进制转化为十六进制,增加十进制转化为八进制、二进制的功能
思路:查表法
java提供的功能:
Integer.toBinaryString();Integer.toOctalString();Integer.toHexString();*/
import java.util.*;
class System_Convert 
{
	public static void main(String[] args) 
	{
		System.out.println("请输入一个整数:");
		Scanner input = new Scanner(System.in);
		int num = input.nextInt();//从键盘输入一个整数
		String str_hex = toHex(num);//十进制——》十六进制
		String str_oct = toOct(num);//十进制——》八进制
		String str_bin = toBin(num);//十进制——》二进制
		System.out.println("Hex:"+str_hex);
		System.out.println("Oct:"+str_oct);
		System.out.println("Bin:"+str_bin);
	}

	public static String toHex(int num){
		return "0x"+trans(num,15,4);
	}
	public static String toOct(int num){
		return "0"+trans(num,7,3);
	}
	public static String toBin(int num){
		return trans(num,1,1);
	}

	public static String trans(int num,int base,int offset){//base:进制,offset:数据右移的位数
		if(num == 0)
			return "0";//考虑到0的输出,否则0的输出为空
		char[] arr = new char[32];
		char[] table = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
		int index = arr.length;
		while(num != 0){
			int tmp = num & base;//获取对应进制的末几位
			num = num >>> offset;//无符号右移对应进制的位数
			arr[--index] = table[tmp];//获取的数作为查表的索引逆序存储于数组中
		}
		return toString(arr,index);
	}

	public static String toString(char[] arr,int index){//将数组元素转化为字符串
		String s = "";
		for(int i = index;i<arr.length;i++){
			s = s + arr[i];//任何数据与字符串相加都是相连接
		}
		return s;
	}
}

测试结果:


数组的排序和查找:

/*
选择排序:依次选出余下的最小值
冒泡排序:依次两两比较,需要arr.length-1趟比较
二分查找:数组必须先有序,(不能先排序再查找,因为排序时数组元素的索引可能会改变)
*/
class  Sort
{
	public static void main(String[] args) 
	{
		int[] arr = {12,34,1,4,56,78,45};
		//printarr(arr);
		selectSort(arr);
		//bubbleSort(arr);
		printarr(arr);
		int index = half_search(arr,1);
		if(index == -1)
			System.out.println("没有找到");
		else 
			System.out.println("该元素在数组中的索引是"+index);
	}
	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[i]>arr[j]){
					swap(arr,i,j);//交换两元素
				}
			}
		}
	 }
	 public static void bubbleSort(int[] arr){//冒泡排序
		for(int i=0;i<arr.length-1;i++){//只需arr.length-1趟排序
			for(int j=0;j<arr.length-i-1;j++){
				if(arr[j]>arr[j+1]){
					swap(arr,j,j+1);//交换两元素
				}
			}
		}
	 }
	 public static int half_search(int[] arr,int key){
		int min = 0;
		int max = arr.length-1;
		int mid;
		while(min<=max){
			mid = (min+max)>>1;
			if(arr[mid]==key)
				return mid;
			else if(arr[mid]>key)
				max = mid-1;
			else 
				min = mid+1;
		}
		return -1;//没有找到¥¥¥若return min;则解决:如果往有序数组中插入一个数并保持元素有序,如何获得该位置?(数组不能插入元素)
	 }
	 public static void swap(int[] arr,int x,int y){//交换数组两元素
		int tmp = arr[x];
		arr[x] = arr[y];
		arr[y] = tmp;
	 }
	 public static void printarr(int[] arr){//打印数组元素
		for(int i=0;i<arr.length;i++){
			if(i!=arr.length-1){
				System.out.print(arr[i]+",");
			}
			else{
				System.out.println(arr[i]);
			}//去掉小尾巴,
		}
	 }
}
2.二维数组的定义和在内存中的表示:


/*
二维数组的定义和理解:“数组中的数组”
*/
class Arrays 
{
	public static void main(String[] args) 
	{/*
		int[][] array = new int[4][3];//第一种定义,二维数组的长度以及二维数组中一维数组的长度都确定了
		System.out.println(array);//[[I@9e5c73,[表示数组,两个表示二维数组,@表示分隔符,9e5c73表示哈希地址
		System.out.println(array[0]);//[I@c791b9
		System.out.println(array[0][0]);//0
		System.out.println(array.length);//4
		System.out.println(array[0].length);//3

		int[][] arr = new int[3][];//第二种定义,明确了二维数组的长度,没有明确一维数组的长度
		System.out.println(arr);//[[I@9e5c73
		System.out.println(arr[0]);//null,因为一维数组没有定义
		System.out.println(arr[0][0]);//NullPointerException空指针异常,一维数组没有定义,无法访问一维数组里的元素
		System.out.println(arr.length);//3
		System.out.println(arr[0].length);//NullPointerException
*/
		int[][] arrays = {{1,2,3},{4,5,6,7},{8,9}};//第三种定义方式
		for(int i = 0;i<arrays.length;i++){//输出
			for(int j=0;j<arrays[i].length;j++){
				if(j!=arrays[i].length-1)
					System.out.print(arrays[i][j]+",");
				else
					System.out.println(arrays[i][j]);
			}
		}
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值