所有数据类型的转置函数

时间:2015-12-23 10:10:21

标签: java arrays

我在java中有一个函数,用于转换2D数组。但是这个函数只需要double [] []。有没有办法让它采用所有类型的数据类型?(我的意思是像一个全局函数,它接受任何数据类型作为输入并返回特定数据类型的结果?)我的代码如下:

public static double[][] transpose(double[][] a)    
{
    double[][] trans = new double[a[0].length][a.length];
    if (a.length > 0)
    {
        for( int i = 0; i < a[0].length; i++)
            {
            for(int j=0; j<a.length; j++)
                {
                    trans[i][j] = a[j][i];
                }
            }
    }return trans;  
}

2 个答案:

答案 0 :(得分:1)

有一种方法,但我认为这样做并不好。您可以将函数的返回类型设为Object

public static Object[][] transpose(Object[][] a)    
{
    Object[][] trans = new Object[a[0].length][a.length];
    if (a.length > 0)
    {
        for( int i = 0; i < a[0].length; i++)
            {
            for(int j=0; j<a.length; j++)
                {
                    trans[i][j] = a[j][i];
                }
            }
    }
    return trans;  
}

您可以通过将数组转换为Object数组并将其提供给函数来使用此方法:

    int[][] multi = new int[][] { { 1, 2 }, { 3, 4 }, { 5, 5 }, { 7, 6 }, { 9, 8 } };

    Object[][] o = new Object[multi[0].length][multi.length];

    for (int i = 0; i < multi[0].length; i++) {
        for (int j = 0; j < multi.length; j++) {
            o[i][j] = multi[j][i];
        }
    }

    transpose(o);

但请注意,您还必须向后转换返回值:

    Object[][] returnValue = transpose(o);
    int[][] multiTransposed = new int[returnValue[0].length][returnValue.length];

    for (int i = 0; i < returnValue[0].length; i++) {
        for (int j = 0; j < returnValue.length; j++) {
            multiTransposed[i][j] = (int)returnValue[j][i];
        }
    }

这是一个有点棘手的工作。在提供功能之前,您始终必须知道阵列的数据类型。在我的例子中,它是int

希望有所帮助!

答案 1 :(得分:1)

使用泛型:

public static <T> T[][] transpose2DGeneric(T[][] a) {
    T[][] trans = a.clone();

    for (int i = 0; i < a[0].length; i++) {
        for (int j = 0; j < a.length; j++) {
            trans[i][j] = a[j][i];
        }
    }

    return trans;
}

如果我们使用Lists而不是普通数组,我们可以得到:

public static <T> List<List<T>> transpose2DList(List<List<T>> a) {
    List<List<T>> trans = new ArrayList<List<T>>(a);

    for (int i = 0; i < a.size(); i++) {
        for (int j = 0; j < a.get(i).size(); j++) {
            trans.get(i).set(j, a.get(j).get(i));
        }
    }

    return trans;
}

所以你可以使用List<List<Integer>>, List<List<Double>> ...