// A program that produces a cross-reference listing.
// Barry Cornelius, 6th March 2000
import java.text. BreakIterator;
import java.io.   BufferedReader;
import java.io.   InputStreamReader;
import java.io.   IOException;
import java.util. Iterator;
import java.util. Map;
import java.util. Map.Entry;
import java.util. Set;
import java.util. TreeMap;
import java.util. TreeSet;
import java.net.  URL;
public class CrossRef
{
   private static Map iMap;
   private static int iLineNumber;
   private static String iLine;
   public  static void main(final String[] pArgs) throws IOException
   {
      iMap = new TreeMap();
      URL tURL = new URL("http://www.dur.ac.uk/~dcl0bjc/CrossRef.txt");
      BufferedReader tInputHandle =
            new BufferedReader(new InputStreamReader(tURL.openStream()));
      iLineNumber = 0;
      while (true)
      {
         iLine = tInputHandle.readLine();
         if (iLine==null)
         {
            break;
         }
         iLineNumber++;
         iProcessLine();
      }
      // System.out.println(iMap);
      iOutputCrossRef();
   }
   public static void iProcessLine()
   {
      final BreakIterator tBoundary = BreakIterator.getWordInstance();
      tBoundary.setText(iLine);
      int tStart = tBoundary.first();
      while (true)
      {
         final int tEnd = tBoundary.next();
         if (tEnd==BreakIterator.DONE)
         {
            break;
         }
         final String tWord = iLine.substring(tStart, tEnd);
         Set tSet;
         if (iMap.containsKey(tWord))
         {
            tSet = (Set)iMap.get(tWord);
         }
         else 
         {
            tSet = new TreeSet();
            iMap.put(tWord, tSet);
         }
         tSet.add(new Integer(iLineNumber));
         // System.out.println(iLineNumber + " " + tWord + " " + tSet);
         tStart = tEnd;
      }
   }
   public static void iOutputCrossRef()
   {
      final Set tEntrySet = iMap.entrySet();
      final Iterator tEntrySetIterator = tEntrySet.iterator();
      while (tEntrySetIterator.hasNext())
      {
         Entry tEntry = (Entry)tEntrySetIterator.next();
         String tWord = (String)tEntry.getKey();
         System.out.print(tWord + " appears on lines:");
         Set tLineNumberSet = (Set)tEntry.getValue();
         Iterator tLineNumberSetIterator = tLineNumberSet.iterator();
         while (tLineNumberSetIterator.hasNext())
         {
            Integer tInteger = (Integer)tLineNumberSetIterator.next();
            System.out.print(" " + tInteger.intValue());
         }
         System.out.println();
      }
   }
}
