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