/***********************************************************************
* Name: COS 126 Staff
* NetID: cos126
* Precept: P99
*
* Ballot: represent a preferential ballot for RIRV
*
* Dependencies: Queue
*
* Note: there are MANY possible correct solutions! This is just one of them.
*/
public class Ballot {
// instance variable: candidate list, favorite first
private Queue<String> list;
// constructor: make preferential ballot, ordered favorite to least
public Ballot(String[] prefs) {
list = new Queue<String>();
// favorite, at start of prefs, is the first one in
for (int i = 0; i < prefs.length; i++)
list.enqueue(prefs[i]);
}
// give string representation, most favorite in front
public String toString() {
// to help avoid extra > at start
boolean first = true;
// build the answer
String result = "";
for (String name : list) {
if (!first)
result += " > ";
else
first = false;
result += name;
}
return result;
}
// which remaining candidate is favorite?
public String top() {
// return the first name
for (String name : list)
return name;
// line to make compiler happy, since it thinks list might be empty
return "whatever";
}
// which remaining candidate is least favorite?
public String bottom() {
// find and store the last name, overwriting all others
String last = "whatever";
for (String name : list)
last = name;
// only the last one remains
return last;
}
// remove candidate from the ballot
public void cut(String candidate) {
Queue<String> newList = new Queue<String>();
// keep everyone, in order, except the one we want to eliminate
for (String name : list) {
if (!name.equals(candidate))
newList.enqueue(name);
}
// did we actually eliminate someone?
if (newList.size() == list.size())
throw new RuntimeException(candidate + " not on list");
// save the changes
list = newList;
}
public static void main(String[] args) {
String[] testPrefs = {"Doug", "Nanxi", "Bebe", "Aleksey"};
Ballot b = new Ballot(testPrefs);
System.out.println(b); // toString(): "Doug > Nanxi > Bebe > Aleksey"
System.out.println(b.top()); // gives "Doug"
System.out.println(b.bottom()); // gives "Aleksey"
b.cut("Doug");
System.out.println(b); // gives "Nanxi > Bebe > Aleksey"
System.out.println(b.top()); // "Nanxi" - change from original top()
b.cut("Bebe");
System.out.println(b); // gives "Nanxi > Aleksey"
b.cut("Bebe"); // throws a RuntimeException
}
}