2015-12-23 2 views
1

У меня есть функция в 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; 
} 
+0

это метод возврата, как это может генерировать только один тип данных, поэтому нет хорошего способа для того, что вы описываете, чтобы сделать –

+0

ya .. так что нет другого альтернативного метода, который я могу попробовать? –

+1

Вы можете создать общий метод, который обрабатывает любой не примитивный массив, но для любого примитивного массива потребуется отдельный метод. См. Например, как реализуется Arrayys.copyOf. – Eran

ответ

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; 
} 

Вы можете использовать этот метод литья ваш массив в массив объектов и передать его функции:

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]; 
     } 
    } 

Это немного сложная работа вокруг. Вы всегда должны знать тип данных своего массива, прежде чем перейти к funtion. В моем примере это было int.

Надеюсь, что это поможет!

+1

И обходной путь с большим количеством накладных расходов. –

+1

Это помогает. Таким образом, мне не нужно иметь отдельные функции для разных типов данных. Конечно, литье и переработка будут занимать несколько строк кода. Но выглядит более эффектно в большей картине. Спасибо –

+1

Помните, что вы не просто кастинг, вы выделяете третий временный массив и используете гораздо больше распределений/ходов, чем требуется. Вероятно, если вам нужна эффективность, вам лучше иметь общий метод и использовать рефлексию, чтобы прямо выделить типизированный массив. – Jack

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; 
} 

Если мы будем использовать списки вместо простых массивов мы можем получить это:

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>> ...

Смежные вопросы