——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是二维数组。
示例:
<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>