Solution #1
/* Given an FTS, returns a new FTS having the same fields as the given
** one, but in the opposite order.
** Algorithm: Let the given FTS be x_0;x_1;x_2;...;x_n.
** This version employs a loop each iteration of which "adds" one more
** field to beginning of the FTS under construction, so that, after the
** k-th loop iteration, the FTS under construction has value
** x[k-1];x[k-2];x[k-3]; ... ;x[0];
*/
public static String reverseOf1(String fts) {
   final int N = numberOfFields(fts);
   String result = "";
   for (int k=0; k != N; k = k+1) {
      // place the k-th field of fts at the beginning of 'result'
      String fieldToInsert = getField(fts,k);
      result = fieldToInsert + ";" + result;
      // alternative having same effect as line above:
      //result = insertField(result, 0, fieldToInsert);
   }   
   return result;
}

Solution #2
/* Given an FTS, returns a new FTS having the same fields as the given
** one, but in the opposite order.
** Algorithm: Let the given FTS be x_0;x_1;x_2;...;x_n.
** This version employs a loop each iteration of which "adds" one more
** field to end of the FTS under construction, so that, after the
** k-th loop iteration, the FTS under construction has value
** x[n];x[n-1];x[n-2]; ... ;x[n-k+1];
*/
public static String reverseOf2(String fts) {
   final int N = numberOfFields(fts);
   String result = "";
   for (int k=0; k != N; k = k+1) {
      // place field N-1-k of fts at the end of 'result'
      String fieldToInsert = getField(fts,N-1-k);
      result = result + fieldToInsert + ";";
      // alternative having same effect as line above:
      //result = insertField(result,k, fieldToInsert);
   }   
   return result;
}