在方法内迭代ArrayList

时间:2011-03-08 17:33:50

标签: java arraylist

我有一个持有候选对象的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 个答案:

答案 0 :(得分:4)

如果您尝试在课堂上迭代课程,请使用

for (Candidate c : this ) ...

答案 1 :(得分:2)

没有必要延长ArrayList(除非您认为这可能更清晰,或者您没有发布其他内容)。

您可以创建ArrayList Candidate并使用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);

答案 2 :(得分:1)

我会像这样做我的候选人课程:

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循环。

答案 3 :(得分:0)

不要扩展ArrayList,实施List,并使用delegation,添加自己的方法。如果可以,也可以使用for-each

答案 4 :(得分:0)

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);

答案 5 :(得分:0)

public class Candidates<Candidate> extends ArrayList<Candidate>  {

这是一个类型参数名称 =候选人的列表(它只是一个名称,与候选人类没有任何关系)

public class Candidates extends ArrayList<Candidate>  {

这是一份候选人名单。

我没有阅读完整的问题和所有的答案,但扩展ArrayList最不是你想要做的。你更希望使用构图而不是继承。