Перечисление Java и вопрос цикла - PullRequest
0 голосов
/ 19 июля 2011

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

for (int i = 0; i < aNodes.getLength(); i++) {
  //
}

Например, предположим, что список содержит 12 элементов, и я знаю, что 3 элемента представляют строку в таблице, а следующие 3 относятся к следующей строке. Это означает, что мой список из 12 узлов происходит из таблицы HTML, содержащей 4 строки.

После каждой строки я хочу что-то сделать, например, создать новый объект и заполнить его ... или что-то еще. У меня есть решение:

ArrayList<Account> mAccounts = new ArrayList<Account>();
Account account = new Account();

for (int i = 0; i < aNodes.getLength(); i++) {

            String nodeValue = aNodes.item(i).getNodeValue();
            boolean isNewRow = (i % COLS_PER_ROW == 0);

            if (isNewRow) {
                account = new Account();
                mAccounts.add(account);
            }

            switch (i % COLS_PER_ROW) {
            case ACCOUNT_POS:
                account.setAccount(nodeValue);
                break;
            case BALANCE_POS:
                account.setBalance(nodeValue);
                break;
            case DATE_POS:
                account.setDate(nodeValue);
                break;
            }
        }

Но есть много вещей, которые мне не нравятся в этом решении:

  1. Экземпляр учетной записи создается дважды первый раз, один раз за пределами цикла, а затем один раз, потому что обнаружена новая строка.
  2. Он использует целочисленные константы ACCOUNT_POS = 0, BALANCE_POS = 1, DATE_POS = 2 ... это не очень приятно, и я думаю, что я должен использовать перечисление.
  3. Я не могу использовать enum с переменной цикла 'i'.
  4. Я не могу использовать a для каждого цикла, поскольку узлы не реализуют правильный интерфейс,

Может кто-нибудь предложить лучший способ сделать это, который решает список вещей, которые мне не нравятся в этом?

Спасибо.

Ответы [ 3 ]

1 голос
/ 19 июля 2011

Я не могу использовать enum с переменной цикла 'i'.

Нет, но вы можете использовать:

for(SomeEnum item : SomeEnum.values()){
  // code here
}
1 голос
/ 19 июля 2011

Вы работаете с файлом на основе позиции, поэтому, если я вас правильно понимаю, у вас есть структура, которая организована следующим образом:

  • счет;
  • баланс,
  • date;

Зная это, возможно, вы могли бы лучше справиться с индексом в цикле while, а не с помощью цикла for, следующим образом:

int i = 0;
while (i < aNodes.getLength()) {
   account = new Account();
   account.setAccount(aNodes.item(i).getNodeValue());
   account.setBalance(aNodes.item(i+1).getNodeValue());
   account.setBalance(aNodes.item(i+2).getNodeValue());
   mAccounts.add(account)
   i += 3;
}

Я бы также предложил извлечь код заполнения счета в новом методе, таком как «extractAccountFromNodes», а затем вызвать его внутри цикла;таким образом, цикл мог бы стать:

int i = 0;
while (i < aNodes.getLength()) {
   mAccount.add(extractAccountFromNodes(aNodes, i));
   i += 3;
}

с помощью метода extractAccountFromNodes следующим образом:

private Account extractAccountFromNodes(Nodes nodes, int position) {
   account = new Account();
   account.setAccount(nodes.item(i).getNodeValue());
   account.setBalance(nodes.item(i+1).getNodeValue());
   account.setBalance(nodes.item(i+2).getNodeValue());
   return account;
}
1 голос
/ 19 июля 2011

Вы можете увеличить i на COLS_PER_ROW вместо 1 и затем написать:

for (int i = 0; i < aNodes.getLength(); i += COLS_PER_ROW) {
    account = new Account();
    String account = aNodes.item(i).getNodeValue();
    account.setAccount(account);
    String balance = aNodes.item(i+1).getNodeValue();
    account.setBalance(balance);
    String date = aNodes.item(i+2).getNodeValue();
    account.setDate(date);
    mAccounts.add(account);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...