zoukankan      html  css  js  c++  java
  • 算法Sedgewick第四版-第1章基础-004一封装交易对象

    1.

      1 package ADT;
      2 
      3 /******************************************************************************
      4  *  Compilation:  javac Transaction.java
      5  *  Execution:    java Transaction
      6  *  Dependencies: StdOut.java
      7  *  
      8  *  Data type for commercial transactions.
      9  *
     10  ******************************************************************************/
     11 
     12 import java.util.Arrays;
     13 import java.util.Comparator;
     14 
     15 import algorithms.util.StdOut;
     16 
     17 
     18 /**
     19  *  The <tt>Transaction</tt> class is an immutable data type to encapsulate a
     20  *  commercial transaction with a customer name, date, and amount.
     21  *  <p>
     22  *  For additional documentation, 
     23  *  see <a href="http://algs4.cs.princeton.edu/12oop">Section 1.2</a> of 
     24  *  <i>Algorithms, 4th Edition</i> by Robert Sedgewick and Kevin Wayne. 
     25  *
     26  *  @author Robert Sedgewick
     27  *  @author Kevin Wayne
     28  */
     29 public class Transaction implements Comparable<Transaction> {
     30     private final String  who;      // customer
     31     private final Date    when;     // date
     32     private final double  amount;   // amount
     33 
     34 
     35     /**
     36      * Initializes a new transaction from the given arguments.
     37      *
     38      * @param  who the person involved in this transaction
     39      * @param  when the date of this transaction
     40      * @param  amount the amount of this transaction
     41      * @throws IllegalArgumentException if <tt>amount</tt> 
     42      *         is <tt>Double.NaN</tt>, <tt>Double.POSITIVE_INFINITY</tt>,
     43      *         or <tt>Double.NEGATIVE_INFINITY</tt>
     44      */
     45     public Transaction(String who, Date when, double amount) {
     46         if (Double.isNaN(amount) || Double.isInfinite(amount))
     47             throw new IllegalArgumentException("Amount cannot be NaN or infinite");
     48         this.who    = who;
     49         this.when   = when;
     50         if (amount == 0.0) this.amount = 0.0;  // to handle -0.0
     51         else               this.amount = amount;
     52     }
     53 
     54     /**
     55      * Initializes a new transaction by parsing a string of the form NAME DATE AMOUNT.
     56      *
     57      * @param  transaction the string to parse
     58      * @throws IllegalArgumentException if <tt>amount</tt> 
     59      *         is <tt>Double.NaN</tt>, <tt>Double.POSITIVE_INFINITY</tt>,
     60      *         or <tt>Double.NEGATIVE_INFINITY</tt>
     61      */
     62     public Transaction(String transaction) {
     63         String[] a = transaction.split("\s+");
     64         who    = a[0];
     65         when   = new Date(a[1]);
     66         double value = Double.parseDouble(a[2]);
     67         if (value == 0.0) amount = 0.0;  // convert -0.0 0.0
     68         else              amount = value;
     69         if (Double.isNaN(amount) || Double.isInfinite(amount))
     70             throw new IllegalArgumentException("Amount cannot be NaN or infinite");
     71     }
     72 
     73     /**
     74      * Returns the name of the customer involved in this transaction.
     75      *
     76      * @return the name of the customer involved in this transaction
     77      */
     78     public String who() {
     79         return who;
     80     }
     81  
     82     /**
     83      * Returns the date of this transaction.
     84      *
     85      * @return the date of this transaction
     86      */
     87     public Date when() {
     88         return when;
     89     }
     90  
     91     /**
     92      * Returns the amount of this transaction.
     93      *
     94      * @return the amount of this transaction
     95      */
     96     public double amount() {
     97         return amount;
     98     }
     99 
    100     /**
    101      * Returns a string representation of this transaction.
    102      *
    103      * @return a string representation of this transaction
    104      */
    105     @Override
    106     public String toString() {
    107         return String.format("%-10s %10s %8.2f", who, when, amount);
    108     }
    109 
    110     /**
    111      * Compares two transactions by amount.
    112      *
    113      * @param  that the other transaction
    114      * @return { a negative integer, zero, a positive integer}, depending
    115      *         on whether the amount of this transaction is { less than,
    116      *         equal to, or greater than } the amount of that transaction
    117      */
    118     public int compareTo(Transaction that) {
    119         if      (this.amount < that.amount) return -1;
    120         else if (this.amount > that.amount) return +1;
    121         else                                return  0;
    122     }    
    123 
    124     /**
    125      * Compares this transaction to the specified object.
    126      *
    127      * @param  other the other transaction
    128      * @return true if this transaction is equal to <tt>other</tt>; false otherwise
    129      */
    130     @Override
    131     public boolean equals(Object other) {
    132         if (other == this) return true;
    133         if (other == null) return false;
    134         if (other.getClass() != this.getClass()) return false;
    135         Transaction that = (Transaction) other;
    136         return (this.amount == that.amount) && (this.who.equals(that.who))
    137                                             && (this.when.equals(that.when));
    138     }
    139 
    140 
    141     /**
    142      * Returns a hash code for this transaction.
    143      *
    144      * @return a hash code for this transaction
    145      */
    146     public int hashCode() {
    147         int hash = 17;
    148         hash = 31*hash + who.hashCode();
    149         hash = 31*hash + when.hashCode();
    150         hash = 31*hash + ((Double) amount).hashCode();
    151         return hash;
    152     }
    153 
    154     /**
    155      * Compares two transactions by customer name.
    156      */
    157     public static class WhoOrder implements Comparator<Transaction> {
    158 
    159         @Override
    160         public int compare(Transaction v, Transaction w) {
    161             return v.who.compareTo(w.who);
    162         }
    163     }
    164 
    165     /**
    166      * Compares two transactions by date.
    167      */
    168     public static class WhenOrder implements Comparator<Transaction> {
    169 
    170         @Override
    171         public int compare(Transaction v, Transaction w) {
    172             return v.when.compareTo(w.when);
    173         }
    174     }
    175 
    176     /**
    177      * Compares two transactions by amount.
    178      */
    179     public static class HowMuchOrder implements Comparator<Transaction> {
    180 
    181         @Override
    182         public int compare(Transaction v, Transaction w) {
    183             if      (v.amount < w.amount) return -1;
    184             else if (v.amount > w.amount) return +1;
    185             else                          return  0;
    186         }
    187     }
    188 
    189 
    190     /**
    191      * Unit tests the <tt>Transaction</tt> data type.
    192      */
    193     public static void main(String[] args) {
    194         Transaction[] a = new Transaction[4];
    195         a[0] = new Transaction("Turing   6/17/1990  644.08");
    196         a[1] = new Transaction("Tarjan   3/26/2002 4121.85");
    197         a[2] = new Transaction("Knuth    6/14/1999  288.34");
    198         a[3] = new Transaction("Dijkstra 8/22/2007 2678.40");
    199 
    200         StdOut.println("Unsorted");
    201         for (int i = 0; i < a.length; i++)
    202             StdOut.println(a[i]);
    203         StdOut.println();
    204         
    205         StdOut.println("Sort by date");
    206         Arrays.sort(a, new Transaction.WhenOrder());
    207         for (int i = 0; i < a.length; i++)
    208             StdOut.println(a[i]);
    209         StdOut.println();
    210 
    211         StdOut.println("Sort by customer");
    212         Arrays.sort(a, new Transaction.WhoOrder());
    213         for (int i = 0; i < a.length; i++)
    214             StdOut.println(a[i]);
    215         StdOut.println();
    216 
    217         StdOut.println("Sort by amount");
    218         Arrays.sort(a, new Transaction.HowMuchOrder());
    219         for (int i = 0; i < a.length; i++)
    220             StdOut.println(a[i]);
    221         StdOut.println();
    222     }
    223 
    224 }
  • 相关阅读:
    v-for
    class样式绑定
    数据单向绑定(v-bind:)和数据的双向绑定(v-model)
    v-on 事件修饰符
    C++中相对路径与绝对路径以及斜杠与反斜杠的区别(转)
    计算机图形学—判断点在直线上的方法(转)
    Eclipse XML/HTML语法高亮方法
    虚拟机 ubuntu 上网的配置过程
    VirtualBox虚拟机网络设置(四种方式)(转)
    查看Linux服务器网络状态(转)
  • 原文地址:https://www.cnblogs.com/shamgod/p/5403791.html
Copyright © 2011-2022 走看看