日期:2014-05-20  浏览次数:20960 次

关于数组逆转的问题:当数组非常大的时候。
Java code


package com.yaxing.suanfa;

public class ArrayDemo {
    
    /**
     * 改变了数组
     * */
    public static int[] reverseArray(int[] a){
        int temp;
        for(int i=0;i<a.length/2;i++){
            temp = a[i];
            a[i] = a[a.length-1-i];
            a[a.length-1-i] = temp;
        }
        return a;
    }
    
    public static char[] reverseArray(char[] a){
        char temp;
        for(int i=0;i<a.length/2;i++){
            temp = a[i];
            a[i] = a[a.length-1-i];
            a[a.length-1-i] = temp;
        }
        return a;
    }
    /**
     * 使用泛型
     * */
    public Object[] reverseArray1(Object[] a){
        Object temp;
        for(int i=0;i<a.length/2;i++){
            temp = a[i];
            a[i] = a[a.length-1-i];
            a[a.length-1-i] = temp;
        }
        return a;
    }
    /**
     * 逆序输出,不逆转数组
     * */
    public static int[] reverseArrayPrint(int[] a){
         
        for(int i=0;i<a.length;i++){
            if(i==a[a.length-1]){
                System.out.print(a[a.length-1-i]+" ");
            }else{
                System.out.print(a[a.length-1-i]+"、");
            }
        }
        return a;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        int a[] = new int[100];
        for(int i=0;i<a.length;i++){
            a[i]=i;
        }
        System.out.println("原始数组:");
        for(int i:a){
            if(i==a[a.length-1]){
                System.out.print(i+" ");
            }else{
                System.out.print(i+"、");
            }
        }
        System.out.println();
        int b[] = ArrayDemo.reverseArray(a);
        System.out.println("逆转后数组:");
        for(int i:b){
            if(i==b[b.length-1]){
                System.out.print(i+" ");
            }else{
                System.out.print(i+"、");
            }
        }
        System.out.println();
        System.out.println("只逆序打印数组");
        ArrayDemo.reverseArrayPrint(a);
        String cc = "abcdefg";
        char c[] = cc.toCharArray();;
        ArrayDemo.reverseArray(c);
        System.out.println();
        System.out.println("逆序字符串");
        for(char i:c){
            if(i==c[c.length-1]){
                System.out.print(i+" ");
            }else{
                System.out.print(i+"、");
            }
        }
    }

}



思路就是:第一个跟最后一个换,第二个跟倒数第二个换。。。依次类推。

但是,当数组非常大的时候,
就会报如下异常:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

另外,我想把这个改成泛型的,该怎么改呢,就是不管我下面定义的是什么类型的数组,上面都可以处理,
而不用重载好多个reverseArray()方法啊。

------解决方案--------------------
分成多个数组来逆转,况且这个是否OutOfMemoryError跟你的JVM设置有关的,如果数组过大可能会直接进入老年代,这个时候如果你的老年代大小不够,那肯定要报内存溢出的。
至于泛型的话,建议你看看ArrayList的实现嘛,你应该能从中学到一些你想要的东西
------解决方案--------------------
OutOfMemoryError 这个是内存溢出 和你数组没关系的,设置一下就可以。
------解决方案--------------------
能用sun的api尽量别自己写方法。
java.util 
类 Collections

reverse
public static void reverse(List<?> list)反转指定列表中元素的顺序。
此方法以线性时间运行。 


参数:
list - 元素要被反转的列表。 
抛出: 
UnsupportedOperationException - 如果指定列表或其列表迭代器不支持 set 操作。