Index: lucene/src/java/org/apache/lucene/search/FieldValueHitQueue.java
===================================================================
--- lucene/src/java/org/apache/lucene/search/FieldValueHitQueue.java	(revision 996730)
+++ lucene/src/java/org/apache/lucene/search/FieldValueHitQueue.java	(working copy)
@@ -52,8 +52,6 @@
    * there is just one comparator.
    */
   private static final class OneComparatorFieldValueHitQueue extends FieldValueHitQueue {
-
-    private final FieldComparator comparator;
     private final int oneReverseMul;
     
     public OneComparatorFieldValueHitQueue(SortField[] fields, int size)
@@ -64,10 +62,9 @@
       }
 
       SortField field = fields[0];
-      comparator = field.getComparator(size, 0);
+      setComparator(0,field.getComparator(size, 0));
       oneReverseMul = field.reverse ? -1 : 1;
 
-      comparators[0] = comparator;
       reverseMul[0] = oneReverseMul;
       
       initialize(size);
@@ -85,7 +82,7 @@
       assert hitA != hitB;
       assert hitA.slot != hitB.slot;
 
-      final int c = oneReverseMul * comparator.compare(hitA.slot, hitB.slot);
+      final int c = oneReverseMul * firstComparator.compare(hitA.slot, hitB.slot);
       if (c != 0) {
         return c > 0;
       }
@@ -111,7 +108,7 @@
         SortField field = fields[i];
 
         reverseMul[i] = field.reverse ? -1 : 1;
-        comparators[i] = field.getComparator(size, i);
+        setComparator(i, field.getComparator(size, i));
       }
 
       initialize(size);
@@ -182,9 +179,15 @@
 
   int[] getReverseMul() { return reverseMul; }
 
+  protected void setComparator(int pos, FieldComparator comparator) {
+    if (pos==0) firstComparator = comparator;
+    comparators[pos] = comparator;
+  }
+
   /** Stores the sort criteria being used. */
   protected final SortField[] fields;
-  protected final FieldComparator[] comparators;
+  protected final FieldComparator[] comparators;  // use setComparator to change this array
+  protected FieldComparator firstComparator;      // this must always be equal to comparators[0]
   protected final int[] reverseMul;
 
   @Override
Index: lucene/src/java/org/apache/lucene/search/TopFieldCollector.java
===================================================================
--- lucene/src/java/org/apache/lucene/search/TopFieldCollector.java	(revision 996730)
+++ lucene/src/java/org/apache/lucene/search/TopFieldCollector.java	(working copy)
@@ -48,10 +48,12 @@
 
     FieldComparator comparator;
     final int reverseMul;
+    final FieldValueHitQueue queue;
     
     public OneComparatorNonScoringCollector(FieldValueHitQueue queue,
         int numHits, boolean fillFields) throws IOException {
       super(queue, numHits, fillFields);
+      this.queue = queue;
       comparator = queue.getComparators()[0];
       reverseMul = queue.getReverseMul()[0];
     }
@@ -92,7 +94,8 @@
     @Override
     public void setNextReader(IndexReader reader, int docBase) throws IOException {
       this.docBase = docBase;
-      comparator = comparator.setNextReader(reader, docBase);
+      queue.setComparator(0, comparator.setNextReader(reader, docBase));
+      comparator = queue.firstComparator;
     }
     
     @Override
@@ -381,10 +384,11 @@
     
     final FieldComparator[] comparators;
     final int[] reverseMul;
-    
+    final FieldValueHitQueue queue;
     public MultiComparatorNonScoringCollector(FieldValueHitQueue queue,
         int numHits, boolean fillFields) throws IOException {
       super(queue, numHits, fillFields);
+      this.queue = queue;
       comparators = queue.getComparators();
       reverseMul = queue.getReverseMul();
     }
@@ -446,7 +450,7 @@
     public void setNextReader(IndexReader reader, int docBase) throws IOException {
       this.docBase = docBase;
       for (int i = 0; i < comparators.length; i++) {
-        comparators[i] = comparators[i].setNextReader(reader, docBase);
+        queue.setComparator(i, comparators[i].setNextReader(reader, docBase));
       }
     }
 
