/***********************************************************************
* Name: COS 126 Staff
* NetID: cos126
* Precept: P99
*
* Ballot: represent a preferential ballot for RIRV
*
* Dependencies: none
*
* Note: there are MANY possible correct solutions! This is just one of them.
*/
public class Ballot {
// an array of all remaining candidates from favorite to least
// it might have extra unused space at the end
private String[] remaining;
// number of remaining candidates
private int n;
// make preferential ballot (order: favorite to least)
public Ballot(String[] prefs) {
n = prefs.length;
// make a defensive copy
remaining = new String[n];
for (int i = 0; i < n; i++)
remaining[i] = prefs[i];
}
// convert to String
public String toString() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++)
// append > and name
sb.append(" > " + remaining[i]);
// cut off the initial " > "
return sb.substring(3);
}
// which remaining candidate is our favorite?
public String top() {
// most preferred at start
return remaining[0];
}
// which remaining candidate is our least favorite?
public String bottom() {
// least preferred at end
return remaining[n-1];
}
// remove this candidate from this ballot
public void cut(String candidate) {
// pass through array, looking for our desired candidate
for (int i = 0; i < n; i++) {
if (remaining[i].equals(candidate)) {
// found them! reduce n; bump everyone after closer to favorite
n--;
for (int j = i; j < n; j++)
remaining[j] = remaining[j+1];
// job's done
return;
}
}
// we never found a match
throw new RuntimeException("Couldn't find " + candidate);
}
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
}
}