2013-11-08 3 views
0

У меня есть куча переменных, объявленные в качестве 2D массивов:Java - метод Вызова с параметром значения другого переменного типа

int[][] array1 = {{}}; 
int[][] array2 = {{}}; 
etc.. 

Я в настоящее время использую метод для вызова другого метода с одним из переменные в качестве параметра с переключателем:

public void invokeMethod(){ 
switch(variableNumber){ 
    case 1: method(piece1); 
    break; 
    case 2: method(piece2); 
    break; 
    etc.. 
    } 
} 

Это чувствует себя феноменально глупый способ подхода к этой проблеме, есть более умное решение? Возможно, хранение переменных в массиве? То, что я хотел бы сделать, если я сталкиваюсь с тысячами 2D массивов, является вызовом метода со значением переменной другого типа данных, например:

String arrayToBeInvokedWith = "array1"; 

method(arrayToBeInvokedWith){ 
} 

(Да, я знаю, что это слишком упрощенно, но вы можете получить от него идею)

Есть ли подобное решение? Любая обратная связь очень ценится.

EDIT: Все массивы имеют одинаковый размер.

+0

У меня возникли проблемы с дизайном. Как правило, тело метода не должно знать об объеме вне его, если область как-то не представлена ​​как аргумент. Если у вас есть метод, который работает с разными 'int [] []' и должен работать по-разному на основе ссылки 'Object', вы должны передать второй аргумент, определяющий контекст, а затем действовать на этот аргумент внутри метода. – Mena

ответ

0

Вместо того, чтобы объявить кучу отдельных массивов ...

Написать класс, который инкапсулирует экземпляр двумерного массива.

Если вы затем используете общую коллекцию, тип которой является вашим специальным классом массива, вы можете поместить все экземпляры ваших массивов в одну коллекцию.

Тогда, когда вам нужно работать с массивами, вы можете просто перебирать коллекции.

Или, если важно иметь конкретную идентификацию, связанную с каждым из ваших объектов 2D-массива, затем сопоставить идентификатор как ключ объекта в HashMap. Затем, когда вам нужно работать на каком-либо массиве, вы можете получить его с карты, используя свой ключ.

На месте

public void invokeMethod(){ 
    switch(variableNumber){ 
     case 1: method(piece1); 
      break; 
     case 2: method(piece2); 
      break; 
     : 
     : 
    } 
} 

вы можете просто использовать что-то вроде

public <T extends MyArrayClass> void invokeMethod(String arrKey, HashMap<String,T> 
     arrays) { 
    T my2dArray = arrays.get(arrKey); 
    method(my2dArray); 
    : 
    : 
} 

Столкнувшись с проблемой, как ваша, решение часто, чтобы создать новый тип, который представляет абстракцию для вашего данные.

+0

Отлично, это отлично! Благодаря! –

+0

HashMap может быть излишним, но ключ должен определить тип данных, который служит абстракцией для ваших данных. Вы можете использовать массив или список или что-то лучшее для ваших нужд. Я думаю, что вы не хотите делать, это объявить кучу 2d массивов, а затем использовать один большой большой «переключатель» на них. – scottb

0

Вам действительно нужно использовать массив? Вы можете использовать HashMap для хранения ключа, ссылающегося на один массив. Чтобы получить один массив, вы просто передаете ключ массива и получаете его.

HashMap<String, int[]> hashMap = new HashMap<String, int[]>(); 

int array1[] = {1, 2}; 
int array2[] = {2, 3}; 
int array3[] = {3, 4}; 

hashMap.put("array1", array1); 
hashMap.put("array2", array2); 
hashMap.put("array3", array3); 

int arrayWanted[] = hashMap.get("array2"); 
Смежные вопросы