基于管道过滤器的KWIC系统实现(3)

来源:互联网 发布:新星星知我心1998全集 编辑:程序博客网 时间:2024/04/28 22:06

package lws;

import java.util.ArrayList;
import java.util.Iterator;
import java.io.CharArrayWriter;
import java.io.IOException;


public class Alphabetizer extends Filter{

  public Alphabetizer(Pipe input, Pipe output){
    super(input, output);
  }

  protected void transform(){
    try{
      ArrayList<String> lines = new ArrayList<String>();
      CharArrayWriter writer = new CharArrayWriter();
     
      int c = input_.read();
      while(c != -1){
        writer.write(c);
        if(((char) c) == '\n'){         
          String line = writer.toString();
          lines.add(line);
          writer.reset();
        }       
        c = input_.read();
      }

      sort(lines);
     
      Iterator<String> iterator = lines.iterator();
      while(iterator.hasNext()){
        char[] chars = ((String) iterator.next()).toCharArray();
        for(int i = 0; i < chars.length; i++)
          output_.write(chars[i]);
      }

      output_.closeWriter();
    }catch(IOException exc){
      exc.printStackTrace();
      System.err.println("KWIC Error: Could not sort circular shifts.");
      System.exit(1);
    }

  }

  private void sort(ArrayList<String> lines){
    int size = lines.size();

    for(int i = (size / 2 - 1); i >= 0; i--)
      siftDown(lines, i, size);

    for(int i = (size - 1); i >= 1; i--){
      Object tmp = lines.get(0);
      lines.set(0, lines.get(i));
      lines.set(i, (String) tmp);
      siftDown(lines, 0, i);     
    }
  }
  private void siftDown(ArrayList<String> lines, int root, int bottom){   
    int max_child = root * 2 + 1;

    while(max_child < bottom){
      if((max_child + 1) < bottom)
        if(((String) lines.get(max_child + 1)).compareTo((String) lines.get(max_child)) > 0)
          max_child++;

      if(((String) lines.get(root)).compareTo((String) lines.get(max_child)) < 0){
        Object tmp = lines.get(root);
        lines.set(root, lines.get(max_child));
        lines.set(max_child, (String) tmp);
        root = max_child;
        max_child = root * 2 + 1;
      }else
        break;
    }   
  }

}

 

 

package lws;

import java.io.IOException;
import java.io.CharArrayWriter;
import java.util.StringTokenizer;

public class CircularShifter extends Filter{

  public CircularShifter(Pipe input, Pipe output){
    super(input, output);
  }

  protected void transform(){
    try{
      CharArrayWriter writer = new CharArrayWriter();
     
      int c = input_.read();
      while(c != -1){
        if(((char) c) == '\n'){
          String line = writer.toString();
          StringTokenizer tokenizer = new StringTokenizer(line);
          String[] words = new String[tokenizer.countTokens()];
          int i = 0;
          while(tokenizer.hasMoreTokens())
            words[i++] = tokenizer.nextToken();

          for(i = 0; i < words.length; i++){
            String shift = "";
            for(int j = i; j < (words.length + i); j++){
              shift += words[j % words.length];
              if(j < (words.length + i - 1))
                shift += " ";
            }
            shift += '\n'
            char[] chars = shift.toCharArray();
            for(int j = 0; j < chars.length; j++)
              output_.write(chars[j]);
          }    
          writer.reset();
        }else
          writer.write(c);
        //The output is formatted to char[],and every word is separated by a space
        c = input_.read();
      }

      output_.closeWriter();
    }catch(IOException exc){
      exc.printStackTrace();
      System.err.println("KWIC Error: Could not make circular shifts.");
      System.exit(1);
    }
  }

}