我有一个持有候选对象的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。
答案 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最不是你想要做的。你更希望使用构图而不是继承。