黑马程序员——Java基础---- 数组(静态初始化_常见问题)(04)

                                           ——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——- 


   数组(静态初始化_常见问题)(排序、进制转换等)

一、数组概述

可以说是一种容器,是同一种类型数据的集合。(自动从0编号,方便操作。)

格式

        如: int []  arr = new int [3];  也可以写成: int arr[] = new int[3];
        如: int []  arr = new int []{1,2,3,4,5};
        还有一种简写的静态初始化格式:如: int [] arr={1,2,3,4,5};

        其中:new是用来在堆内存中产生一个容器实体。

*****运行的时候才开辟数组空间, 编译的时候只检查语法错误。
*****System.out.println(arr);//打印的是引用的地址

二、排序

示例:
package com.iheima;
/*
 对给定数组排序{5,7,3,2,59,21}
 */
public class ArraySort{
	public static void main(String[] args) {
		int[] arr=new int[]{5,7,3,2,59,21};
		//selectSort(arr);
		bubbleSort(arr);
	}
<span style="text-align: justify;">      </span><span style="text-align: justify;">    //选择排序  原理:用数组的元素和第一个元素比较,大、小的交换。</span>
	public static void selectSort(int[] a){
		
			for(int i=0;i<a.length;i++){
				for(int j=i+1;j<a.length ;j++){
				if(a[i]<a[j]){
					int temp=a[i];
					a[i]=a[j];
					a[j]=temp;
					}			
			}
				System.out.println(a[i]);
		}			
	}
       //冒泡排序,相邻元素比较,最值冒泡
	public static void bubbleSort(int[] a){
		for(int i=0;i<a.length-1;i++){
			for(int j=0;j<a.length-1-i;j++){
				if(a[j]<a[j+1]){
					int temp=a[i];
					a[i]=a[j];
					a[j]=temp;
				}
			}			
		}
	}
}
上面是比较元素大小,还可以<strong>比较角标:</strong>
<strong>//也可以比较下标
</strong><span style="white-space: pre;">	</span>public static int getMax_2(int[] a){
<span style="white-space: pre;">		</span>int max=0;
<span style="white-space: pre;">		</span>for(int i=1;i<a.length;i++){
<span style="white-space: pre;">			</span>if(a[i]>a[max])
<span style="white-space: pre;">				</span>max=i;
<span style="white-space: pre;">		</span>}
<span style="white-space: pre;">		</span>System.out.println("Max:"+a[max]);
<span style="white-space: pre;">		</span>return max;
<span style="white-space: pre;">	</span>}
<span style="white-space: pre;">	</span>public int getMin(int[] a){
<span style="white-space: pre;">		</span>int min=a[0];
<span style="white-space: pre;">		</span>for(int i=1;i<a.length;i++){
<span style="white-space: pre;">			</span>if(a[i]<min)
<span style="white-space: pre;">				</span>min=a[i];
<span style="white-space: pre;">		</span>}
<span style="white-space: pre;">		</span>return min;
<span style="white-space: pre;">	</span>}<strong>
</strong>
还有其余的排序算法。

三、进制转换

进制转换的原理就是:&base,再向右位移

示例:
public class TransTest {
	public static void main(String[] args) {
		//toBin(60);
		//toHex_3(60);
		toBin_2(6);
	}
	//10进制-->2进制 
	public static void toBin(int num){
		StringBuffer sb=new StringBuffer();//容器
		while(num>0){
			//System.out.println(num%2);
			sb.append(num%2);
			num=num/2;
		}
		System.out.println(sb.reverse());//
	}
	//10进制-->16进制
	public static void toHex(int num){
		StringBuffer sb=new StringBuffer();//容器
		for(int x=0;x<8;x++){//4个字节,4位一次,共8次
			 int temp=num & 15;
			 if(temp>9)//大于9用字母表示
				//System.out.println(num-10+"A");//
				sb.append((char)(temp-10+'A'));//--->查表法
			else
				sb.append(temp);
			 num=num>>>4;//无符号右移4位
	}
		System.out.println(sb.reverse());//
	}
	<strong>// 查表法  10进制-->16进制</strong>
	public static void toHex_2(int num){
		char[] chs=new char[]{'0','1','2','3','4','5','6','7','8',
				'9','A','B','C','D','E','F'};
		StringBuffer sb=new StringBuffer();
		for(int x=0;x<8;x++){
			int temp=num&15;
			System.out.print(chs[temp]);
			sb.append(chs[temp]);
			num=num>>>4;
			}
		System.out.println();
		System.out.println("16进制数是:"+sb.reverse());
	}

	public static void toHex_3(int num){
		char[] chs={'0','1','2','3','4','5','6','7','8',
				'9','A','B','C','D','E','F'};
		
		char[] arr=new char[8];//一被定义,默认初始化值是:'\U0000'(unicode编码)这是一个空位
		//int pos=0;//指针
		int pos=arr.length;
		while(num!=0){
			int temp=num&15;
			//System.out.print(chs[temp]);
			//arr[pos++]=chs[temp];
			arr[--pos]=chs[temp];
			num=num>>>4;
			}
		//倒着打印
//		for(int x=pos-1;x>=0;x--){
//			System.out.print(arr[x]);
//		}
		//现在是倒着存储数据,正着打印
		for(int x=pos;x<arr.length;x++){
			System.out.print(arr[x]);
		}
	}
<pre name="code" class="html" style="line-height: 26px;">/*
 0  1  2  3  4  5  6  7  8  9   A   B   C   D  E  F  --->16进制元素
 0  1  2  3  4  5  6  7  8  9  10  11  12  13 14 15 
 
 查表法:将所有元素存储起来,建立对应关系。
 每一次&15的值作为索引去查建立好的表,找到对应元素。这样比temp-10+'A'简单的多。
 
 这个表是怎么定义的 ?
 通过数据的形式来定义。
 
 通过查表法,发现终于出结果了,但是结果是反着的,可以使用容器StringBuffer的reverse方法来完成反转。
 
 如果该工具现在还没有学习,可以使用学过的数组来完成存储。
 
 */

 
 

	//用查表法完成10进制-->2进制
	public static void toBin_2(int num){
		char[] chs={'0','1'};
		//定义临时容器
		char[] arr=new char[32];//
		int pos=arr.length;
		while(num!=0){
			int temp=num&1;
			arr[--pos]=chs[temp];
			num=num>>>1;
		}
		for(int x=pos;x<arr.length;x++){
			System.out.print(arr[x]);
		}
	}
}
因为转换可以使用抽象的公共方法:


公共方法是:


package com.iheima;
/*
 * 进制转换的公共方法
 */
public class TransTest {
	public static void main(String[] args) {
		//toBin(6);
		//toBa(23);
               toHex(0);
	}
	//10进制-->2进制
	public static void toBin(int num){
		trans(num,1,1);
	}
	//10进制-->8进制
	public static void toBa(int num){
		trans(num,7,3);
	}
	//10进制-->16进制
	public static void toHex(int num){
		trans(num,15,4);
	}
	public static void trans(int num,int base,int offset){
		if(num==0){
			System.out.println(0);
			return;
		}
		char[] chs={'0','1','2','3','4','5','6','7','8',
				'9','A','B','C','D','E','F'};
		char[] arr=new char[32];
		int pos=arr.length;
		while(num!=0){
			int temp=num&base;
			arr[--pos]=chs[temp];
			num=num>>>offset;
		}
		for(int i=pos;i<arr.length;i++){
			System.out.print(arr[i]);
		}
	}
}
四、2维数组


格式:

        int[][] arr= new int[3][2];

        解释:以上格式表示定义了名称为arr的二维数组。有3个一维数组,每一个一维数组中有2个元素。一维数组的名称分别为arr[0],arr[1],arr[2]。给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78。


         int[][] arr= new int[3][];

         注:此种格式中每个一维数组都是默认初始化值null。


         int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};//每一个一维数组中具体元素都初始化了。

注:一种特殊定义写法:int[]x,y[]; x是一维数组,y是二维数组。


示例:


需求:求2维数组的和:

<pre name="code" class="html"><span style="font-family:Microsoft YaHei;">public static void sum(){
	int[][] arr={{3,5,7},{2,6},{9,4,7,6}};
	int sum=0;
	for(int i=0;i<arr.length;i++){
		for(int j=0;j<arr[i].length;j++){
			sum=sum+arr[i][j];
		}
	}
	System.out.println(sum);
	}</span>

 






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值