2014-01-20 4 views
0

У меня есть Java-программа, которая использует несколько HashMaps, по одному для каждой категории, выполненной в гипотетическом ресторане.Динамический вызов существующей переменной

Мне нужно обработать и вывести текст в файл. Тем не менее, я пошел «плохо» и просто написал код шесть раз, вызывая разные хэш-карты в каждый момент времени.

Я не могу оставить точный демо-код, поскольку это будет поставляться как проект и как таковой могут быть найдены случайными искателями плагиата и ошибочно отмечены как плагиат, так как это будет огромный кусок кода. Однако следует проиллюстрировать эту проблему следующим образом.

DoSomething(These); 
DoSomething(All); 
DoSomething(Have); 
DoSomething(Completely); 
DoSomething(Different); 
DoSomething(Names); 

Теперь вместо «DoSomething», представьте себе, 20 строк кода, и на каждые 20 строк я использую один конкретный HashMap.

Я не могу точно заполнить массив и заставить его использовать данные из массива, поскольку он попытается использовать строки вместо HashMap (вызывая DoSomething («Эти») вместо DoSomething (These)).

Есть ли способ динамически вызывать HashMaps, чтобы я мог сократить все это в один цикл, который делает одно и то же для каждого из HashMaps?

+1

Если на всех HashMaps выполняются одни и те же операции, то почему бы просто не создать массив HashMap [], который содержит их все и пропустить? – Kallja

+0

Ваш вопрос, кажется, отвечает вашей проблеме. Поверните 20 строк в метод с параметром карты. – Taylor

+0

Или вместо того, чтобы выполнять одну и ту же операцию 6 раз для 6 разных HashMaps, возможно, отметьте данные в HashMap относительно того, на каких этапах они должны быть обработаны, тогда вы можете выполнить цикл один раз и выполнить соответствующие части один раз. – CodeChimp

ответ

3

Если у вас есть пара HashMaps, позволяет сказать:

HashMap<String, String> aMap; 
HashMap<String, String> anotherMap; 

Вы могли бы заполнить новый ArrayList с этим, например, так:

List<HashMap<String, String>> myMaps = new ArrayList<>(); 
myMaps.add(aMap); 
myMaps.add(anotherMap); 

При этом, вы можете перебирать ваши карты с использованием расширенного цикла:

for (HashMap map : myMaps) { 
    //code goes here 
} 

Выгода заключается в том, что ваш список является dymanically siz ed, поэтому вы можете добавлять и удалять хешмапы из него, как вам будет угодно.

+0

Это именно то, что мне нужно. Использование HashMap таким образом позволило мне сделать HashMap , String>, сохраняя строку, связанную с каждым HashMap, для дальнейшей обработки данных. – Nuno

0

Если каждый кусок вашего кода подобен, IDE, например eclipse, может легко распознать его и refactor его до 6 вызовов «DoSomething» с параметром «Карта».

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

1

Похоже, что пришло время сделать рефакторинг.

  • 6 «разных» методов следует преобразовать в один из параметров, который принимает параметр hashmap . Поскольку это единственное различие, которое они имеют.
  • Также звучит так, что вы должны использовать какую-то коллекцию для своих хешмапов, чтобы вы могли повторять их, и использовать один метод, который вы создали на каждом из них.
0

Я не уверен, исходя из вашего вопроса, что должен делать метод DoSomething, но я понял это так, как будто он должен возвращать определенный HashMap в зависимости от определенной категории заказа, которая предоставляется как Строка. В этом случае вы можете просто создать HashMap из HashMap с помощью строкового ключа для первого HashMap.В зависимости от используемого ключа Sting вы получите соответствующий HashMap.

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