Итерация ArrayList внутри метода - PullRequest
2 голосов
/ 08 марта 2011

У меня есть класс Candidades, который содержит объекты-кандидаты, следующим образом:

import java.util.*;
public class Candidates<Candidate> extends ArrayList<Candidate>  {

public int getTotalVotesCount()
{
    Iterator it = this.iterator();
    int i, total = 0;

    while(it.hasNext())
    {
        Candidate c = (Candidate)it.next();

        total += c.getVoteCount();
    }
    return total;
}
}

Кандидат в класс выглядит следующим образом:

public class Candidate {

private int votes;
private String name;

public String getName()
{
    return this.name;
}

public int getVoteCount()
{
    return this.votes;
}

public void vote()
{
    votes++;
}

public Candidate(String _name)
{
    this.name = _name;
    this.votes = 0;
}
}

Как мне выполнить итерации по нему?

Я знаю, что код для итерации в порядке, так как использование кода вне класса работает.

Тест ниже:

/**

 * @(#)Test.java
 *
 * Test application
 *
 * @author
 * @version 1.00 2011/3/8
 */
import java.util.*;
public class Test {
public static void main(String[] args) {

    Candidates candidates = new Candidates();

    candidates.add(new Candidate("One"));
    candidates.add(new Candidate("Two"));
    candidates.add(new Candidate("Three"));
    candidates.add(new Candidate("Four"));

    Iterator it = candidates.iterator();

    int i = 0;
    while(it.hasNext())
    {
        i++;

        Candidate c = (Candidate)it.next();

        for(int j = 0; j <= i; j++)
        {
            c.vote();
        }
    }

    int total = 0;
    it = candidates.iterator();
    while(it.hasNext())
    {
        Candidate c = (Candidate)it.next();
        total += c.getVoteCount();
    }

    System.out.printf("Votes: %d", total);
}
}

Код, приведенный выше, правильно печатает 14.

Ответы [ 6 ]

4 голосов
/ 08 марта 2011

Если вы пытаетесь перебрать класс внутри класса, используйте this :

for (Candidate c : this ) ...
2 голосов
/ 08 марта 2011

Нет необходимости расширять ArrayList (если вы не думаете, что это может быть более разборчиво или что-то еще, о чем вы не публиковали).

Вы можете создать ArrayList из Candidate sи используйте foreach для итерации:

List<Candidate> candidates = new ArrayList<Candidate>();
candidates.add(new Candidate("One"));
candidates.add(new Candidate("Two"));
candidates.add(new Candidate("Three"));
candidates.add(new Candidate("Four"));

int total = 0;

foreach(Candidate c : candidates) {
    c.vote();
    total += c.getVoteCount();
}

System.out.printf("Votes: %d", total);
1 голос
/ 08 марта 2011

Я бы сделал свой класс Кандидатов следующим образом:

public class Candidates() {
  private List<Candidate> candidates = new ArrayList<Candidate>();

  public int getTotalVotesCount() {
   int total = 0;
   for (Candidate candidate : candidates) {
     total += candidate.getVoteCount();
   }
   return total;
  }
}

Вам все еще нужно заполнить кандидатов, но я бы рекомендовал использовать цикл foreach.

0 голосов
/ 08 марта 2011
public class Candidates<Candidate> extends ArrayList<Candidate>  {

Это список с параметром типа name = Candidate (это просто имя и не имеет ничего общего с классом Candidate)

public class Candidates extends ArrayList<Candidate>  {

Это список кандидатов.

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

0 голосов
/ 08 марта 2011

Candidates на самом деле не является подтипом ArrayList - это не специализированный универсальный контейнер, который расширяет возможности ArrayList, это просто ArrayList + удобный метод для конкретного типа, который там застрял.

Что я мог бы сделать для этого: Candidate класс, как у вас, Candidates класс статического вспомогательного класса для удобного API:

public final class Candidates {
 private Candidates() {} //singleton enforcer
 public static int getTotalVotes(Iterable<Candidate> candidates) {
  //check for nulls
  int total = 0;
  for (Candidate c : candidates) total += c.getVoteCount();
  return total;
 }
 //other convenience methods
}

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

Collection<Candidate> candidates = new //...whatever
// voting scheme
int totalvotes = Candidates.getTotalVotes(candidates);
0 голосов
/ 08 марта 2011

Не расширяйте ArrayList, реализуйте List и используйте делегирование , добавьте свои собственные методы.Также используйте для каждого , если можете.

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