Package timeflow.data.db

Source Code of timeflow.data.db.ActComparator$ArrayComparator

package timeflow.data.db;

import java.util.*;

import timeflow.data.time.RoughTime;

public abstract class ActComparator implements Comparator<Act> {
 
  protected Field field;
  protected boolean ascending=true;
  protected String description;
 
 
  private ActComparator(Field field, String description)
  {
    this.field=field;
    this.description=description;
  }
 
  public String getDescription()
  {
    return description + (ascending ? "" : " (descending)");
  }
 
  public static ActComparator by(Field field)
  {
    Class type=field.getType();
    if (type==Double.class)
      return new NumberComparator(field);
    if (type==String[].class)
      return new ArrayComparator(field);
    if (type==RoughTime.class)
      return new TimeComparator(field);
    return new StringComparator(field);
  }
 
  static class TimeComparator extends ActComparator
  {
   
    TimeComparator(Field field)
    {
      super(field, "by time");
    }

    @Override
    public int compare(Act o1, Act o2) {
      RoughTime a1=o1.getTime(field);
      RoughTime a2=o2.getTime(field);
      if (a1==a2)
        return 0;
      if (a1==null)
        return ascending ? 1 : -1;
      if (a2==null)
        return ascending ? -1 : 1;
      int n=a1.compareTo(a2);
      return ascending ? n : -n;
    }
  }

 
  static class ArrayComparator extends ActComparator
  {
   
    ArrayComparator(Field field)
    {
      super(field, "by length of "+field.getName());
    }

    @Override
    public int compare(Act o1, Act o2) {
      int n=length(o1.getTextList(field))-length(o2.getTextList(field));
      return ascending ? n : -n;
    }
   
    static int length(String[] s)
    {
      return s==null ? 0 : s.length;
    }
  }
 
  static class StringComparator extends ActComparator
  {
   
    StringComparator(Field field)
    {
      super(field, "by "+field.getName());
    }

    @Override
    public int compare(Act o1, Act o2) {
      int n=val(o1.getString(field)).toString().compareTo(val(o2.getString(field)).toString());
      return ascending ? n : -n;
    }
   
    String val(String s)
    {
      return s==null ? "" : s;
    }
  }
 
  static class NumberComparator extends ActComparator
  {
   
    NumberComparator(Field field)
    {
      super(field, "by "+field.getName());
    }

    @Override
    public int compare(Act o1, Act o2) {
      double x=o1.getValue(field)-o2.getValue(field);
      int n=x>0 ? 1 : x<0 ? -1 : 0;
      return ascending ? n : -n;
    }
   
   
  }
}
TOP

Related Classes of timeflow.data.db.ActComparator$ArrayComparator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.