1. 程式人生 > >Java——陣列的拷貝

Java——陣列的拷貝

1.for迴圈拷貝:

        int[] array={1,2,3,4,5};
        int[] brray=new int[array.length];
        for(int i=0;i<array.length;i++) {
            brray[i]=array[i];
        }

這是基本資料型別,如果修改b[i]的值,則a[i]的值不會發生變化,所以稱之為深拷貝;

	class TestArray{
    private int val=10;
    public void setVal(int val){
        this.val=val;
    }
    public int getVal(){
        return this.val;
    }
}
		 TestArray[] t1=new TestArray[4];
        t1[0]=new TestArray();
        t1[1]=new TestArray();
        t1[2]=new TestArray();
        t1[3]=new TestArray();
        TestArray[] t2=new TestArray[4];
        for(int i=0;i<t1.length;i++) {
            t2[i]=t1[i];
        }

而引用資料型別時,改變t2[i]的值,則t1[i]的值也會發生改變,即為淺拷貝;
總的來說,for迴圈的拷貝是 淺拷貝

2. Object.clone()拷貝:

		int[] array={1,2,3,4,5};
        int[] brray=array.clone();
class TestArray{
    private int val=10;
    public void setVal(int val){
        this.val=val;
    }
    public int getVal(){
        return this.val;
    }
}
    public static void main4(String[] args) {
        TestArray[] t1=new TestArray[4];
        t1[0]=new TestArray();
        t1[1]=new TestArray();
        t1[2]=new TestArray();
        t1[3]=new TestArray();
        TestArray[] t2=t1.clone();
        }

array.clone(),會產生一個新的陣列,然後將array陣列的值複製到新陣列中去;
簡單資料型別是深拷貝;
引用資料型別是淺拷貝,
總的來說是淺拷貝;

3. Arrays.copyOf()拷貝:

		int[] array={1,2,3,4,5};
        int[] brray=Arrays.copyOf(array,array.length);
class TestArray{
    private int val=10;
    public void setVal(int val){
        this.val=val;
    }
    public int getVal(){
        return this.val;
    }
}
 public static void main(String[] args) {
        TestArray[] t1=new TestArray[4];
        t1[0]=new TestArray();
        t1[1]=new TestArray();
        t1[2]=new TestArray();
        t1[3]=new TestArray();
        TestArray[] t2=Arrays.copyOf(t1,t1.length);
        }

同樣的,Arrays.copyOf()會產生一個新陣列,然後將Array陣列的值複製到新陣列中去,與array.clone不同的是,Arrays.copyOf()第二個引數,是定義要拷貝的長度;
簡單資料型別是深拷貝;
引用資料型別是淺拷貝,
總的來說是淺拷貝;
### 4. System.arraycopy()拷貝:

        int[] array={1,2,3,4,5};
        int[] brray=new int[array.length];
        System.arraycopy(array,0,brray,0,array.length);
class TestArray{
    private int val=10;
    public void setVal(int val){
        this.val=val;
    }
    public int getVal(){
        return this.val;
    }
}
public static void main6(String[] args) {
        TestArray[] t1=new TestArray[4];
        t1[0]=new TestArray();
        t1[1]=new TestArray();
        t1[2]=new TestArray();
        t1[3]=new TestArray();
        TestArray[] t2=new TestArray[4];
        System.arraycopy(t1,0,t2,0,t1.length);
        }

System.arraycopy() 裡面有四個引數:
src - 源陣列。
srcPos - 源陣列中的起始位置。
dest - 目標陣列。
destPos - 目標資料中的起始位置。
length - 要複製的陣列元素的數量
System.arrayCopy 只複製已有的陣列,
簡單資料型別是深拷貝;
引用資料型別是淺拷貝,
總的來說是淺拷貝。

練習題

2.2 如何排序陣列並插入某個元素?

 public static void insert(int[] array,int key) {
        Arrays.sort(array);
        int index=0;
        for(int i=0;i<array.length;i++){
            if(key<array[i]){
                index=i;
                break;
            }
        }
       int[] brray=Arrays.copyOf(array,array.length+1);
        for(int j=brray.length-1;j>=index;j--){
            brray[j]=brray[j-1];
        }
        brray[index]=key;
        System.out.println(Arrays.toString(brray));
    }

2.5如何搜尋陣列中的最小值和最大元素?

 public static int[] maxMin(int[] array) {
        int min = array[0];
        int max = array[0];
        int[] brray = {0,0};
        for(int i = 0;i < array.length;i++) {
            if(array[i] > max) {
                max = array[i];
            } else if(array[i] < min) {
                min = array[i];
            }
        }
        brray[0] = min;
        brray[1] = max;
        return brray;
    }

2.6如何合併兩個陣列(合併到一個新的陣列)?

public static void merge(int[] array,int[] brray) {
        int[] crray=new int[array.length+brray.length];
        System.arraycopy(array,0,crray,0,array.length);
        System.arraycopy(brray,0,crray,array.length,brray.length);
        System.out.println(Arrays.toString(crray));
    }

2.10:如何刪除陣列指定元素?

public static void delect(int[] array,int key) {
       Arrays.sort(array);
       int x= Arrays.binarySearch(array,key);
       int[] brray=Arrays.copyOf(array,array.length-1);
       for(int i=x;i<array.length-1;i++){
           brray[i]=array[i+1];
       }
       System.out.println(Arrays.toString(array));
    }

2.11: 如何從陣列中查詢常見的元素?

       int[] array={3,4,2,8,7,5};
       Arrays.sort(array);
       int x= Arrays.binarySearch(array,8);
       System.out.println(x);

1.將奇數放在偶數前面 大小順序不要求

public static void paixu(int[] array){
        int i=0;
        int j=array.length-1;
        while(i<j){

            while(i<j&&array[i]%2!=0){
                i++;
            }
            while(i<j&&array[j]%2==0) {
                j--;
            }
            int tmp=array[i];
            array[i]=array[j];
            array[j]=tmp;
            continue;
        }
        System.out.println(Arrays.toString(array));

2.一個數組是有序的,給定一個key:數字 有兩個數字的和加起來等於key找到這兩個數字的下標。

 public static  void add(int[] array,int key){
     for(int i=0;i<array.length;i++){
         for(int j=i;j<array.length;j++){
             if(key==array[i]+array[j]) {
                 System.out.println(i);
                 System.out.println(j);
                 break;
             }
         }
         break;
     }
    }

3. 一個整形陣列,除了兩個數字只出現一次外,其他數字都是兩次。

  public static int[] findNumberApperOnce(int[] array) {
        int a=0;
        for(int i=0;i<array.length;i++) {
            a=a^array[i];
        }
        int index=weishu(a);
        int n1=0;
        int n2=0;
        for(int i=0;i<array.length;i++) {
            if (isOne(array[i], index)) {
                n1=n1^array[i];
            }else{
                n2=n2^array[i];
            }
        }
        int[] brray={0,0};
        brray[0]=n1;
        brray[1]=n2;
        return brray;
    }
 public static int weishu(int  number) {
        int count=0;
        while((number&1)==0&&count<32){
            number=number>>>1;
            count++;
        }
        return count;
    }
public static boolean isOne(int number,int index) {
        number=number>>index;
        if((number&1)==0){
            return false;
       }
       return true;
    }