package com.etoak.array;
/**
* @ 2014年5月14日10:15:20
* 数组的基本用法:
* 什么是数组?
* 数组就是 一组类型相同而且存储空间连续的数据
* 本案例主要讲解 数组如何定义,如何得到数组中的一个和多个元素以及遍历数组的两种方式(for循环遍历和foreach/forin),数组的复制和排序
* */
public class TestArray {
public static void main(String[] args){
//testArray();//动态初始化数组
//showArray();//静态初始化数组
//copyArray();//数组复制
//showSort();//数组排序
//show();//翻转数组
exec();//练习
}
/*定义数组(三种方式) 初始化数组(两种方式 静态/动态)
* 数组也是一种数据类型,本身就是一种引用类型,我们从它的初始化方法,通过关键字new去完成定义及初始化
* 数组的长度是不变的,一旦数组完成初始化后,它的长度就固定下来了,在内存中占有的空间也就固定了,即使里面的数据被清空了
* 占有的空间还是保留下来了,依然是属于数组的,当然长度依旧是不变的,数组里边存放的数据类型要一致,可以基本数据类型
* 也可以是引用数据类型,但是唯一的标准就是相同的类型。在Java中,类与类是支持继承关系的,所以就可能造成数组里面可以存在多中数据类型的假象
* 1st. 直接创建一个数组 但必须要指定长度 int[] i = new int[5];
* 数组索引起始为0,负数索引在Java中是无效的,会抛出ArrayIndexOutOfBoundException ,如果你尝试用无效的索引访问数组,这个无效的索引可能是一个负索引,或者是大于等于数组长度的索引。
*
* */
public static void testArray(){
//定义一个一维数组,并指定5块存储空间 (动态初始化 静态初始化数组的时候 是直接赋值的)
int[] i = new int[5];
//循环向数组中添加值 不管是否使用循环对数组进行赋值,都需要指定数组下标
for(int h = 0;h<5;h++){
//通过数组的下标索引 进行赋值 在赋值的过程中 如果超出数组长度的话,会抛出java.lang.ArrayIndexOutOfBoundsException 异常信息
i[h] = h;
}
//加强for循环 也叫做foreach / forin 遍历数组所有元素内容
for(int j :i){
System.out.println("加强遍历数组=====>"+j);
}
//普通for循环遍历数组所有元素内容
for(int y = 0;y<i.length;y++){
System.out.println("普通遍历数组======>"+i[y]);
}
//得到数组中一个元素的内容:
//获得数组的长度(数组中元素的个数) lenght属性
System.out.println("数组的长度为====>"+i.length);
}
/*静态初始化数组 即 在定义数组的时候 直接赋值,注意:直接赋值时 不可以指定数组的长度 int[] array = new int[]{1,2,3,7,5,9};
* 静态初始化数组时 给定多少个元素 那么该数组的长度就是多少
* △: int[] array = new int[]{1,2,3,7,5,9}; 这种方式初始化数组时 不可以再对数组进行赋值了,(1) 会替换掉数组中原有的数据 (2) 数组长度会根据初始化时的数据长度大小规定长度,在进行动态赋值会出现数组索引越界异常
* */
public static void showArray(){
int[] array = new int[]{1,2,3,7,5,9};
//进行赋值
// for(int i = 0;i<=6;i++){
// array[i] = i;
// }
for(int k :array){
System.out.println("数组中的元素内容:"+k);
}
//获得数组的长度
System.out.println("数组的长度为====>"+array.length);
//简化上边的写法
int[] a = {1,2,3,4,5,6,7,8,9};
System.out.println("得到数组的长度为:"+a.length);
System.out.println("得到数组中第一个元素内容:"+a[0]);//从下标0开始取值 如果知道要获得的数据的下标,可以直接指定下标进行取值
//获得数组中所有的元素内容使用for或foreach都可以
}
/*复制数组(两种)
* (1) System.arraycopy(1,2,3,4,5);
* 1:要复制的源数组
* 2:源数组的起始位置
* 3:要复制到的目标数组
* 4:目标数组的起始位置
* 5:总共复制多少个元素
* (2) clone();该方式只是将数组从一个数组中复制到另一个数组中,数组的空间没有任何的变化一般不会使用
*
*
* */
public static void copyArray(){
//元素保留在原数组中
int[] data1 = new int[]{1,2,3,4,5,6};
System.arraycopy(data1,0,data1,1,5);
for(int i:data1){
//System.out.println(i);
}
//将data2[] 中的元素 复制到data3中
int[] data2 = new int[]{1,2,3,4,5};
int[] data3 = new int[data2.length*3/2+1];//length*3/2+1 jdk1.6 数组底层默认空间分配方式
System.arraycopy(data2,0,data3,0,data2.length);
for(int j:data3){
System.out.println(j);
}
System.out.println("data2[] 长度:"+data2.length+" data3[] 长度:"+data3.length);
}
/*数组排序 重点在于嵌套循环
* ^ : 按位异或运算符,该运算符可以在内存中不借助第三块空间情况下对两个变量的值进行交换
* 数组排序分为两种方式:
* (1) 自动排序:调用SUN公司util.Arrays.sort(data);方法
* (2) 手动排序 也叫做冒泡排序 就是利用嵌套循环进行排序
* */
public static void showSort(){
int[] data = new int[]{99,33,78,56,17,45};
java.util.Arrays.sort(data);//自动排序,只能按升序进行排列
for(int i:data){
System.out.println(i);
}
//手动对daata[] 进行升序排序
for(int i = 0;i<data.length;i++){
int j = data.length-1-i;
data[i] = data[i]^data[j];
data[j] = data[i]^data[j];
data[i] = data[i]^data[j];
}
for(int i:data){
System.out.println("--->"+i);
}
//手动对data[] 进行降序排序
for(int i = 0;i<data.length;i++){
for(int j = 0;j<data.length;j++){
if(data[i]>data[j]){
data[i] = data[i]^data[j];
data[j] = data[i]^data[j];
data[i] = data[i]^data[j];
}
}
}
for(int i:data){
System.out.println("====>"+i);
}
}
public static void show(){
//翻转整个数组 即 后面的元素到前边来,前边的元素到后边去 中间的保持不变
int[] data = new int[]{25,64,97,32,49,84};
// 1st.
for(int x = 0;x<data.length-1;x++){
for(int y = 0;y<data.length-1-x;y++){
data[y] = data[y] ^ data[y+1];
data[y+1] = data[y] ^ data[y+1];
data[y] = data[y] ^ data[y+1];
}
}
// 2nd.
// for(int i = 0;i<(data.length>>1);i++){
// int j = data.length-1-i;
// data[i] = data[i] ^ data[j];
// data[j] = data[i] ^ data[j];
// data[i] = data[i] ^ data[j];
// }
for(int i:data){
System.out.println("~~~~~~~~~~~"+i);
}
}
/*练习:
* char[] data = new char[]{'a','C','B','D','c','d','b','A'};
* 要求:对数组当中的元素进行排序 为:A a B b C c D d
*
* */
public static void exec(){
char[] data = new char[]{'a','C','B','D','c','d','b','A'};
for(int x = 0;x<data.length-1;x++){
for(int y = 0;y<data.length-1-x;y++){
int num1 = data[y]<<1;
int num2 = data[y+1]<<1;
if(num1>=194) num1-=63;
if(num2>=194) num2-=63;
if(num1>num2){
char temp = data[y];
data[y] = data[y+1];
data[y+1] = temp;
}
}
}
for(char c:data)
System.out.println(c);
}
}
/**
* @ 2014年5月14日10:15:20
* 数组的基本用法:
* 什么是数组?
* 数组就是 一组类型相同而且存储空间连续的数据
* 本案例主要讲解 数组如何定义,如何得到数组中的一个和多个元素以及遍历数组的两种方式(for循环遍历和foreach/forin),数组的复制和排序
* */
public class TestArray {
public static void main(String[] args){
//testArray();//动态初始化数组
//showArray();//静态初始化数组
//copyArray();//数组复制
//showSort();//数组排序
//show();//翻转数组
exec();//练习
}
/*定义数组(三种方式) 初始化数组(两种方式 静态/动态)
* 数组也是一种数据类型,本身就是一种引用类型,我们从它的初始化方法,通过关键字new去完成定义及初始化
* 数组的长度是不变的,一旦数组完成初始化后,它的长度就固定下来了,在内存中占有的空间也就固定了,即使里面的数据被清空了
* 占有的空间还是保留下来了,依然是属于数组的,当然长度依旧是不变的,数组里边存放的数据类型要一致,可以基本数据类型
* 也可以是引用数据类型,但是唯一的标准就是相同的类型。在Java中,类与类是支持继承关系的,所以就可能造成数组里面可以存在多中数据类型的假象
* 1st. 直接创建一个数组 但必须要指定长度 int[] i = new int[5];
* 数组索引起始为0,负数索引在Java中是无效的,会抛出ArrayIndexOutOfBoundException ,如果你尝试用无效的索引访问数组,这个无效的索引可能是一个负索引,或者是大于等于数组长度的索引。
*
* */
public static void testArray(){
//定义一个一维数组,并指定5块存储空间 (动态初始化 静态初始化数组的时候 是直接赋值的)
int[] i = new int[5];
//循环向数组中添加值 不管是否使用循环对数组进行赋值,都需要指定数组下标
for(int h = 0;h<5;h++){
//通过数组的下标索引 进行赋值 在赋值的过程中 如果超出数组长度的话,会抛出java.lang.ArrayIndexOutOfBoundsException 异常信息
i[h] = h;
}
//加强for循环 也叫做foreach / forin 遍历数组所有元素内容
for(int j :i){
System.out.println("加强遍历数组=====>"+j);
}
//普通for循环遍历数组所有元素内容
for(int y = 0;y<i.length;y++){
System.out.println("普通遍历数组======>"+i[y]);
}
//得到数组中一个元素的内容:
//获得数组的长度(数组中元素的个数) lenght属性
System.out.println("数组的长度为====>"+i.length);
}
/*静态初始化数组 即 在定义数组的时候 直接赋值,注意:直接赋值时 不可以指定数组的长度 int[] array = new int[]{1,2,3,7,5,9};
* 静态初始化数组时 给定多少个元素 那么该数组的长度就是多少
* △: int[] array = new int[]{1,2,3,7,5,9}; 这种方式初始化数组时 不可以再对数组进行赋值了,(1) 会替换掉数组中原有的数据 (2) 数组长度会根据初始化时的数据长度大小规定长度,在进行动态赋值会出现数组索引越界异常
* */
public static void showArray(){
int[] array = new int[]{1,2,3,7,5,9};
//进行赋值
// for(int i = 0;i<=6;i++){
// array[i] = i;
// }
for(int k :array){
System.out.println("数组中的元素内容:"+k);
}
//获得数组的长度
System.out.println("数组的长度为====>"+array.length);
//简化上边的写法
int[] a = {1,2,3,4,5,6,7,8,9};
System.out.println("得到数组的长度为:"+a.length);
System.out.println("得到数组中第一个元素内容:"+a[0]);//从下标0开始取值 如果知道要获得的数据的下标,可以直接指定下标进行取值
//获得数组中所有的元素内容使用for或foreach都可以
}
/*复制数组(两种)
* (1) System.arraycopy(1,2,3,4,5);
* 1:要复制的源数组
* 2:源数组的起始位置
* 3:要复制到的目标数组
* 4:目标数组的起始位置
* 5:总共复制多少个元素
* (2) clone();该方式只是将数组从一个数组中复制到另一个数组中,数组的空间没有任何的变化一般不会使用
*
*
* */
public static void copyArray(){
//元素保留在原数组中
int[] data1 = new int[]{1,2,3,4,5,6};
System.arraycopy(data1,0,data1,1,5);
for(int i:data1){
//System.out.println(i);
}
//将data2[] 中的元素 复制到data3中
int[] data2 = new int[]{1,2,3,4,5};
int[] data3 = new int[data2.length*3/2+1];//length*3/2+1 jdk1.6 数组底层默认空间分配方式
System.arraycopy(data2,0,data3,0,data2.length);
for(int j:data3){
System.out.println(j);
}
System.out.println("data2[] 长度:"+data2.length+" data3[] 长度:"+data3.length);
}
/*数组排序 重点在于嵌套循环
* ^ : 按位异或运算符,该运算符可以在内存中不借助第三块空间情况下对两个变量的值进行交换
* 数组排序分为两种方式:
* (1) 自动排序:调用SUN公司util.Arrays.sort(data);方法
* (2) 手动排序 也叫做冒泡排序 就是利用嵌套循环进行排序
* */
public static void showSort(){
int[] data = new int[]{99,33,78,56,17,45};
java.util.Arrays.sort(data);//自动排序,只能按升序进行排列
for(int i:data){
System.out.println(i);
}
//手动对daata[] 进行升序排序
for(int i = 0;i<data.length;i++){
int j = data.length-1-i;
data[i] = data[i]^data[j];
data[j] = data[i]^data[j];
data[i] = data[i]^data[j];
}
for(int i:data){
System.out.println("--->"+i);
}
//手动对data[] 进行降序排序
for(int i = 0;i<data.length;i++){
for(int j = 0;j<data.length;j++){
if(data[i]>data[j]){
data[i] = data[i]^data[j];
data[j] = data[i]^data[j];
data[i] = data[i]^data[j];
}
}
}
for(int i:data){
System.out.println("====>"+i);
}
}
public static void show(){
//翻转整个数组 即 后面的元素到前边来,前边的元素到后边去 中间的保持不变
int[] data = new int[]{25,64,97,32,49,84};
// 1st.
for(int x = 0;x<data.length-1;x++){
for(int y = 0;y<data.length-1-x;y++){
data[y] = data[y] ^ data[y+1];
data[y+1] = data[y] ^ data[y+1];
data[y] = data[y] ^ data[y+1];
}
}
// 2nd.
// for(int i = 0;i<(data.length>>1);i++){
// int j = data.length-1-i;
// data[i] = data[i] ^ data[j];
// data[j] = data[i] ^ data[j];
// data[i] = data[i] ^ data[j];
// }
for(int i:data){
System.out.println("~~~~~~~~~~~"+i);
}
}
/*练习:
* char[] data = new char[]{'a','C','B','D','c','d','b','A'};
* 要求:对数组当中的元素进行排序 为:A a B b C c D d
*
* */
public static void exec(){
char[] data = new char[]{'a','C','B','D','c','d','b','A'};
for(int x = 0;x<data.length-1;x++){
for(int y = 0;y<data.length-1-x;y++){
int num1 = data[y]<<1;
int num2 = data[y+1]<<1;
if(num1>=194) num1-=63;
if(num2>=194) num2-=63;
if(num1>num2){
char temp = data[y];
data[y] = data[y+1];
data[y+1] = temp;
}
}
}
for(char c:data)
System.out.println(c);
}
}