Запись атрибутов в двумерный массив - PullRequest
0 голосов
/ 23 марта 2012

Это мой первый пост здесь, но я остро нуждаюсь в некотором опыте Java (или, возможно, просто в другом взгляде).

Я записываю ArrayList объектов (Result) в 2d массив. Я пытаюсь использовать вложенный цикл. В основном, каждая строка вводится, и первый столбец проверяется, чтобы убедиться, что он совпадает с любым из в ArrayList с тем же атрибутом 'team' если он находит совпадение, обрабатывает его и удаляет, он продолжается до конца списка и затем завершается, чтобы повторить процесс в следующей строке.

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

Может кто-нибудь сказать, почему он не продолжает цикл?

Вот мой код:

private String[][] addScores(String[][] dataTable)
    {
        for(int r = 0; r < dataTable.length; r++)
        {
            Iterator<Result> itr = outcomes.iterator();
            Result temp = new Result();
            while(itr.hasNext())
            {
                temp = itr.next();
                //If a team is found.
                if (dataTable[r][0] == temp.team)
                {
                    //Increases matches played.
                    dataTable[r][1] = String.valueOf(Integer.parseInt(dataTable[r][1]) + 1);
                    if(temp.result == WIN)
                    {
                        dataTable[r][2] = String.valueOf(Integer.parseInt(dataTable[r][2]) + 1);
                    }
                    if(temp.result == DRAW)
                    {
                        dataTable[r][3] = String.valueOf(Integer.parseInt(dataTable[r][3]) + 1);
                    }
                    if(temp.result == LOSE)
                    {
                        dataTable[r][4] = String.valueOf(Integer.parseInt(dataTable[r][4]) + 1);
                    }
                    //removes entry.
                    itr.remove();

                    break;
                }
            }                   
        }

        return dataTable;
    }

Ответы [ 4 ]

1 голос
/ 23 марта 2012

То, как вы храните названия команд и записи побед / ничьих / поражений, очень неудобно. Как насчет этого:

Создать командный класс

public static class Team
{
    String name;
    int win;
    int draw;
    int lose;
}

Поместите эти команды в хэш-карту (используя имя команды в качестве ключа):

Map<String,Team> map = new HashMap<String,Team>( );

Вы добавили бы новые команды на карту с:

map.put( team.name, team );

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

Iterator<Result> itr = outcomes.iterator();
while(itr.hasNext())
{
    Result temp = itr.next();
    Team team = map.get( temp.team );

    // etc...
}
0 голосов
/ 23 марта 2012

Вы прерываете оператор на самом деле прерывает цикл while, а не условие if, поэтому он не зацикливает цикл while.удалить разрыв;

0 голосов
/ 23 марта 2012

Вы выходите из цикла while.Удалите разрыв после itr.remove ();

Вы также сравниваете адреса строк вместо содержимого (когда вы используете ==), поэтому у вас есть совпадения, где первая запись в строке точно такая жеСтроковый объект как в результатах.== не будет иметь значение true, если два разных объекта String имеют одинаковое содержимое.

Кроме того, поскольку вы выполняете итерацию по списку ArrayList, используйте цикл for-each для очистки кода немного.

for(int r = 0; r < dataTable.length; r++)
    {
        for(Result result : outcomes)
        {
            //If a team is found.
            if (dataTable[r][0].equals(result.team))
            {
                //Increases matches played.
                dataTable[r][1] = String.valueOf(Integer.parseInt(dataTable[r][1]) + 1);
                if(result.result == WIN)
                {
                    dataTable[r][2] = String.valueOf(Integer.parseInt(dataTable[r][2]) + 1);
                }
                if(result.result == DRAW)
                {
                    dataTable[r][3] = String.valueOf(Integer.parseInt(dataTable[r][3]) + 1);
                }
                if(result.result == LOSE)
                {
                    dataTable[r][4] = String.valueOf(Integer.parseInt(dataTable[r][4]) + 1);
                }
            }
        }                   
    }

Наконец, вам не нужно ничего возвращать для этого метода, так как массивы (или двойные массивы) являются объектами, и этот метод можно использовать только для побочных эффектов.

0 голосов
/ 23 марта 2012

убедитесь, что String [] [] dataTable является массивом R * 4 2d, и в вашем журнале нет никаких исключений indexoutofboundException.

...