【发布时间】:2016-04-06 23:34:25
【问题描述】:
我创建了一个程序,该程序读取一个文本文件并为候选人创建一个数组,然后为每个选民创建一个对象以及他们偏好的数组。我遇到问题的方法是投票方法。要使候选人获胜,他们必须获得超过一半的选票。因此,一种方法检查他们是否这样做,然后删除投票数最低的候选人,我遇到的问题是在删除它之后我不知道如何检查他们的下一个偏好。
这是我的投票方法
public static int[] doVoting(Voter[] voters, String[] cand){
// Create an int array to store votes
int[] votes= new int[cand.length];
//The first string of the candidates array will correspond to the first number in the int array
for (int i=0; i< voters.length; i++){
for (int j=0; j< cand.length; j++){
for (int k=0;k< voters[i].preferences.length; k++){
if(voters[i].preferences[k].equals(cand[j]))
{votes[j]= votes[j] + 1;
}
else
break;
}
}
}
return votes;
}
这里是它检查选票并做出最终决定的地方
public static void doAlternativeVoteElection(Voter[] voters, String[] candidate)
{
int[] votes = doVoting(voters,candidate);
int max = votes[0];
int min = votes[0];
int sumVote = 0;
int elemax=0;
int elemin=0;
for (int i=0;i<votes.length; i++){
sumVote += votes[i];
if (votes[i] > max){
max=votes[i];
elemax = i;
}
if(votes[i] <= min){
elemin = i;
min= votes[i];
}
}
while (max <= sumVote/2)
{
candidate = arrayDel(elemin, candidate);
System.out.println("he");
votes= arrayDelInt(elemin, votes);
votes = doVoting(voters, candidate);
for (int i=0; i<candidate.length;i++){
System.out.println(candidate[i]);
System.out.println(votes[i]);
if (votes[i]> max){
max=votes[i];
elemax = i;
}
else if(votes[i] <= min){
elemin = i;
min= votes[i];
}
else
continue;
}
if(max > sumVote/2)
break;
}
if(max > sumVote/2)
System.out.println(candidate[elemax]+" wins");
}
public static int[] arrayDelInt(int min, int[] array)
{
int[] retva = new int[array.length-1];
for (int i=0; i<min; i++)
retva[i] = array[i];
for (int i=min+1; i<array.length; i++)
retva[i-1] = array[i];
return retva;
}
问题是 doVoting 方法不会在一个候选人被淘汰后将投票添加到下一个偏好。所以最终 arrayDel 方法只是删除所有元素。
这里是arrayDel方法
public static int[] arrayDelInt(int min, int[] array)
{
int[] retva = new int[array.length-1];
for (int i=0; i<min; i++)
retva[i] = array[i];
for (int i=min+1; i<array.length; i++)
retva[i-1] = array[i];
return retva;
}
arrayDelInt 也一样
【问题讨论】:
-
你也可以发布'arrayDel()'和'arrayDelInt()'方法吗?这是作业吗?您是否仅限于使用数组?该任务的预期运行时间、内存消耗是多少?
-
是的,这是作业,它只需要使用数组,而那些运行时间和内存无关紧要。
-
为什么不创建一个包含“选民”对象数组的“候选人”类。它消耗大量内存,但在最坏的情况下,您可以在线性时间内找到最低投票的候选人,并且您不必更新最大值、最小值或类似的东西,只需选择下一个最低投票的“候选人”。