Unit.java

/*
 * Created on 2007/01/28
 * Copyright (C) 2007 Koga Laboratory. All rights reserved.
 *
 */
package org.mklab.tool.control.system.parameter;

import java.util.Map;
import java.util.TreeMap;


/**
 * 単位を表わすクラスです。
 * 
 * @author koga
 * @version $Revision: 1.3 $, 2007/01/28
 */
public class Unit {

  /** 単位に含まれるSI単位 */
  private Map<SIunit, Integer> unitMap = new TreeMap<>();

  /** SI単位の配列 */
  private SIunit[] units;

  /**
   * 新しく生成された<code>Unit</code>オブジェクトを初期化します。
   * 
   * @param units SI単位の配列
   */
  @SuppressWarnings("boxing")
  public Unit(final SIunit[] units) {
    this.units = new SIunit[units.length];
    System.arraycopy(units, 0, this.units, 0, units.length);

    for (SIunit unit : units) {
      if (this.unitMap.containsKey(unit)) {
        int degree1 = this.unitMap.get(unit);
        int degree2 = unit.getDegree();
        if (degree1 + degree2 == 0) {
          this.unitMap.remove(unit);
        } else {
          this.unitMap.put(unit, degree1 + degree2);
        }
      } else {
        this.unitMap.put(unit, unit.getDegree());
      }
    }
  }

  /**
   * @see java.lang.Object#toString()
   */
  @SuppressWarnings("boxing")
  @Override
  public String toString() {
    StringBuffer unitString = new StringBuffer();
    for (SIunit unit : this.unitMap.keySet()) {
      if (this.unitMap.get(unit) <= 0) {
        continue;
      }

      if (0 < unitString.length()) {
        unitString.append("."); //$NON-NLS-1$
      }
      unitString.append(unit.toString());
    }

    // 次数が負の単位
    for (SIunit unit : this.unitMap.keySet()) {
      if (this.unitMap.get(unit) >= 0) {
        continue;
      }

      if (0 < unitString.length()) {
        unitString.append("."); //$NON-NLS-1$
      }
      unitString.append(unit.toString());
    }

    return unitString.toString();
  }

  /**
   * 単位の配列を返します。
   * 
   * @return 単位の配列
   */
  SIunit[] getUnitAsArray() {
    return this.units;
  }
}