Стиль кодирования Java - повторная передача массива String множеству методов - PullRequest
2 голосов
/ 16 января 2012

Это хорошее кодирование в Java ?:

У меня есть массив строк.String[] strArr = ....Теперь я хочу обработать его и получить результат, поэтому я создал метод, принимающий массив String в качестве аргумента, например,

public bopolen processArray(String[] srtArr){
   // .... some processing
   // loop over string array, process it and create a 
   // list of objects with same size as array
   List<Object> objList = new ArrayList<Object>(strArr.length);
   for(String str : strArr) {
       String[] anotherStrArr = str.split(",");
       Object myObj = new MyObject(anotherStrArr[0],anotherStrArr[1]);
       objList.add(myObj);
   }
   // .... some more processing
   // ....
   // loop over list and call another method 
   // that also takes an String array as argument like
   for (Object obj: objList) { <-- will loop same times as for the String array.
      boolean res = processData(obj.getDataMethod(), strArr); <-- again pass the same array as argument to another method. 
      // This method will get called as many time as array length.
   }
}

Теперь второй метод:

public boolean processData(String data, String[] strArr) {
   // ..... some processing.
   // loop over String array and compare with data to process.
   for(String str: strArr) {
       String[] againStrArr = str.split(",");
       if(againStrArr[0].equals(data)) {
            // ... process on data and get the result.
       }
   }
   // ..... other statements of method.
}

Итаккак видите, я передаю один и тот же массив двум методам и повторяю его снова и снова.Это хорошая практика в Java, так как мой размер массива очень длинный, около 2000 элементов в обычном случае.


Объяснение, почему я так много зацикливаюсь:

Я получил строкумассив из запроса, который содержит db_name и db_score myObject, который я должен обновить в базе данных.Каждый элемент в strArr - это разделенные запятыми значения в БД, такие как db_name,db_score.Поэтому сначала я перебираю массив и создаю строку со всеми именами, разделенными запятыми, а затем запрашиваю в базе данных, чтобы создать список MyObject.Затем я перебираю этот список, чтобы обновить myObj новым счетом, но чтобы получить точную оценку имени, мне снова нужно перебрать массив и сравнить имя, а затем получить его счет.


Это моя таблица под названием Players:

id | name   | score
1  | mark   | 5
2  | mark_1 | 5
3  | mark_2 | 5
4  | mark_3 | 5

Пример данных в массиве строк: {"mark,10","mark_1,15","mark_2,20","mark_3,30"}

Теперь я перебираю массив и создаю строку имени, разделенную запятыми, и использую ее в запросе, например:

select * from myObject where name in ('mark','mark_2','mark_2','mark_3')
                                     |_________________________________|
                                                     |
                    this much part is built from looping over the String array

Итак, первая итерация предназначена для создания предложения where.Теперь этот запрос возвращает список MyObject.Второй раз я перебираю этот список, чтобы обновить счет игроков.Но чтобы получить оценку конкретного имени игрока, мне снова нужно пройтись по strArray и найти его.Поэтому для каждого элемента в списке мне нужно вызвать метод и передать playerName и strArr, чтобы получить его счет, а затем, наконец, обновить его в базе данных.

Ответы [ 4 ]

1 голос
/ 16 января 2012

Не беспокойся об этом.Когда вы передаете массив, сам массив не копируется в стек, просто ссылка на него.Это прекрасно, передать массив так много методов, как вам нравится;и размер массива не повлияет на производительность (за исключением, конечно, самих методов).

0 голосов
/ 16 января 2012

В соответствии с вашим последним объяснением, нет необходимости повторять дважды, вот несколько способов решить вашу проблему:

Первое решение
Вместо создания *Предложение 1006 * для всех элементов, почему бы просто не обновиться напрямую с именем, являющимся предложением WHERE.Например,

loop through all names and scores (your original array)
    split the name and score
    execute an update on database(param_player_name,param_player_score)

Оператор обновления:

UPDATE Players  
SET score = param_player_score  
WHERE name = param_player_name;

Второе решение (не рекомендуется, но только для информации)
Вместо повторения цикла просто добавьтеваши объекты в HashMap вместо массива.пример:

Map<String,Long> myMap = new HashMap<String,Long>();
loop through all names and scores (your original array)
     myMap.put(name,score);

Таким образом, вы сделали name ключ Map, и чтобы получить счет (во втором цикле), вы просто позвоните:

Long score = myMap.get(name);

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

ВАЖНОЕ ПРИМЕЧАНИЕ
При работе с базой данных всегда используйте ID столбца, а не все остальное при обновлении и получении данных.Итак, ваш WHERE должен фильтроваться по вашему столбцу id всегда, предполагая, что это Unique и NOT NULL, тогда как ваше поле Name не равно Unique и может быть NULL

0 голосов
/ 16 января 2012

вместо objList Вы можете использовать массив MyObject, длина которого равна длине strArr. Я предполагаю, что вы можете использовать только метод для обработки массива и данных и использовать только один для цикла, поскольку strArr уже доступен, так что количество итераций определено.

0 голосов
/ 16 января 2012

Среда выполнения Java имеет хорошее управление памятью.Он даже очищает неиспользуемые переменные, когда они не используются ... так что вы даже можете объявить массив с миллионами элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...