Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Mar 22nd, 2010 | Syntax: XML | Size: 13.04 KB | Hits: 72 | Expires: Never
Copy text to clipboard
  1. package jpp.marketanalysis.exploration;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5.  
  6. import java.io.InputStreamReader;
  7. import java.util.ArrayList;
  8. import java.util.Collections;
  9. import java.util.Date;
  10. import java.util.Iterator;
  11. import java.util.Vector;
  12.  
  13. import java.util.Set;
  14.  
  15. import jpp.marketanalysis.data.DataStorage;
  16. import jpp.marketanalysis.data.Dataset;
  17.  
  18. /**
  19.  * Klasse zur Konsolenbasierten Analyse der Aktiendaten.
  20.  * @author Hendrik Herschlein
  21.  *
  22.  */
  23. public class CLShareExploration {
  24.  
  25.     private static ShareExploration se;
  26.    
  27.     /**Datastorage.
  28.      *
  29.      */
  30.     public static DataStorage db;
  31.  
  32.     /**
  33.      * Der Konstruktor der Klasse, welcher als Argument ein Objekt der Klasse
  34.      * ShareExploration erhaelt, welches die jeweiligen Datenanfragen auswerten
  35.      * wird.
  36.      *
  37.      * @param s s
  38.      */
  39.     public CLShareExploration(ShareExploration s) {
  40.         this.se = s;
  41.  
  42.     }
  43.  
  44.     /**
  45.      * Diese Methode gibt alle gespeicherten Daten zu einem bestimmten
  46.      * Unternehmen in uebersichtlicher Form aus. Zuerst wird hierfuer eine Liste
  47.      * aller im System gespeicherten Unternehmen ausgegeben und den Namen
  48.      * Nummern zugeordnet. Diese soll folgende Form haben:
  49.      *
  50.      *
  51.      * Zu folgenden Aktien sind Daten gespeichert: [0]: Adidas [1]: Allianz N
  52.      * [2]: BASF Bitte geben Sie die gewuenschte Nummer ein:
  53.      *
  54.      * Wie das Beispiel zeigt, soll die Auflistung dabei alphabetisch geordnet
  55.      * aufsteigend erfolgen! Nach Eingabe der jeweiligen Nummer werden alle
  56.      * gespeicherten Daten zu einer Aktie --- d.h. alle Datasets mit der
  57.      * toString()- Methode --- untereinander ausgegeben. Wird statt einer Nummer
  58.      * der Befehl "EXIT" eingegeben, wird die Methode beendet. Im Falle einer
  59.      * nicht vergebenen Nummer oder Fehleingabe des Benutzers soll
  60.      *
  61.      * Fehler: Diese Nummer ist nicht vergeben.
  62.      *
  63.      * ausgegeben und die Interaktion neu gestartet werden. Nach einem Durchlauf
  64.      * soll die Methode wieder an den Anfang der Interaktion springen, d.h.
  65.      * insbesondere dass die Methode so lange laeuft, bis sie per "EXIT"-Befehl
  66.      * beendet wird.
  67.      */
  68.     public void selectByStockName() {
  69.         db = se.getDB();
  70.         String s = "";
  71.         String name;
  72.         int x = -1;
  73.         ArrayList<String> names = this.findKeys();
  74.  
  75.         Collections.sort(names);
  76.  
  77.         System.out.println("Zu folgenden Aktien sind Daten gespeichert:");
  78.         for (int j = 0; j < names.size(); j++) {
  79.            System.out.println("[" + j + "]: " + names.get(j));
  80.        }
  81.        System.out.println("Bitte geben Sie die gewuenschte Nummer ein:");
  82.  
  83.        BufferedReader br = new BufferedReader
  84.        (new InputStreamReader(System.in));
  85.  
  86.        try {
  87.  
  88.            s = br.readLine();
  89.            if (s == null) {
  90.                return;
  91.            }
  92.  
  93.        } catch (IOException e) {
  94.            System.out.println("Fehler: Diese Nummer ist nicht vergeben.");
  95.            this.selectByStockName();
  96.            return;
  97.        }
  98.        if (s.equals("EXIT")) {
  99.            return;
  100.        } else {
  101.            try {
  102.                x = Integer.parseInt(s);
  103.            } catch (Exception e) {
  104.                System.out.println("Fehler: Diese Nummer ist nicht vergeben.");
  105.                this.selectByStockName();
  106.                return;
  107.            }
  108.            if (x < 0 || x > names.size() - 1) {
  109.                 System.out.println("Fehler: Diese Nummer ist nicht vergeben.");
  110.                 this.selectByStockName();
  111.             } else {
  112.                 name = names.get(x);
  113.  
  114.                 for (int i = 0; i < db.getAllData().get(name).size(); i++) {
  115.                    System.out.println(db.getEntry(name).get(i));
  116.                }
  117.                this.selectByStockName();
  118.            }
  119.        }
  120.  
  121.    }
  122.  
  123.    /**
  124.     * Diese Methode nimmt auf der Konsole Befehle entgegen und gibt die
  125.     * angeforderten Berechnungsergebnisse zurueck. Die Eingaben sollen ueber
  126.     * die Konsole durchgefuehrt werden, auch hierfuer dient ein
  127.     * BufferedStreamReader, welchem der InputStreamReader System.in uebergeben
  128.     * wird. Die Interaktion soll dabei wie folgt ablaufen:
  129.     *
  130.     * 1. Der Benutzer wird gefragt, WAS berechnet werden soll
  131.     * ("Was moechten Sie berechnen?"). Moegliche Eingaben sind "MIN", "MAX",
  132.     * "AVG" und "EXIT". Fehleingaben werden dabei folgendermassen quittiert:
  133.     *
  134.     * Unbekannter Befehl - moegliche Befehle sind MIN, MAX und AVG.
  135.     *
  136.     * 2. Der Benutzer wird gefragt, WO dies berechnet werden soll, also ob
  137.     * lokal fuer eine einzelne Aktie oder global ueber alle vorhandenen Daten
  138.     * ("Lokal oder global?"). Erlaubte Eingaben sind daher "LOK", "GLOB" und
  139.     * "EXIT". Fehleingaben sollen dabei folgendermassen quittiert werden:
  140.     *
  141.     * Unbekannter Befehl - moegliche Befehle sind GLOB und LOK.
  142.     *
  143.     * 3. Wurde "GLOB" gewaehlt, wird das Ergebnis der Berechnung ausgegeben.
  144.     * Das Format der Ausgabe muss im globalen Fall wie folgt aussehen:
  145.     *
  146.     * < Name > erzielte am < Datum > das global [beste|schlechteste] Ergebnis:
  147.      * < Wert >. oder: Der globale Durchschnitt aller Werte ist < Wert >.
  148.      *
  149.      * 4. Wurde eine lokale Berechnung ausgewaehlt, wird nun nach dem Namen der
  150.      * Aktie gefragt ("Wie ist der Name der Aktie?"). Auch hier kann als Befehl
  151.      * "EXIT" eingegeben werden. Dann wird das Ergebnis der lokalen Berechnung
  152.      * ausgegeben. Das Format der Ausgabe muss dabei wie folgt aussehen:
  153.      *
  154.      * Ergebnis: Das Unternehmen < Name > erzielte am < Datum > ein
  155.      * [Maximum|Minimum] von < Wert >. oder: Ergebnis: < Name > erzielte ein
  156.      * durchschnittliches Ergebnis von < Wert >.
  157.      *
  158.      * Werden zu einer Aktie keine Daten gefunden, soll
  159.      *
  160.      * Entschuldigung, aber zu einer solchen Aktie liegen keine Daten vor.
  161.      *
  162.      * ausgegeben werden.
  163.      *
  164.      * Sollte bei einer der voranstehenden Punkte eine Fehleingabe gemacht und
  165.      * die entsprechende (oben beschriebene) Programmausgabe gemacht worden
  166.      * sein, so ist zum Anfang der Methode zurueckzuspringen, d.h. die
  167.      * Interaktion beginnt von vorne!
  168.      *
  169.      * Die Methode soll durch den Befehl "EXIT" beendet werden, ungeachtet davon
  170.      * an welchem Punkt der Interaktion sie sich befindet.
  171.      *
  172.      * Nach einem Durchlauf soll die Methode wieder an den Anfang der
  173.      * Interaktion springen, d.h. insbesondere dass die Methode so lange laeuft,
  174.      * bis sie per "EXIT"-Befehl beendet wird.
  175.      */
  176.     public void interactiveExploration() {
  177.  
  178.         String what = null;
  179.         String where = null;
  180.         BufferedReader br = new BufferedReader
  181.         (new InputStreamReader(System.in));
  182.  
  183.         System.out.println("Was moechten Sie berechnen?");
  184.  
  185.         try {
  186.             what = br.readLine();
  187.         } catch (IOException e) {
  188.             e.printStackTrace();
  189.             this.interactiveExploration();
  190.             return;
  191.         }
  192.         if (what == null) {
  193.             return;
  194.         }
  195.         if (what.equals("EXIT")) {
  196.             return;
  197.         } else if ("MAX".equals(what) || "MIN".equals(what)
  198.                 || "AVG".equals(what)) {
  199.             System.out.println("Lokal oder global?");
  200.  
  201.             try {
  202.                 where = br.readLine();
  203.             } catch (IOException e) {
  204.                 e.printStackTrace();
  205.                 this.interactiveExploration();
  206.                 return;
  207.             }
  208.  
  209.             if (where.equals("EXIT")) {
  210.                 return;
  211.             } else if (where.equals("GLOB") && what.equals("MAX")) {
  212.                Vector<Object> max = se.getGlobalMaximum();
  213.                 Dataset da = (Dataset) max.get(1);
  214.                 String name = (String) max.get(0);
  215.                 Date d = da.getDate();
  216.                 double value = da.getHigh();
  217.                 System.out.println(name + " erzielte am " + d
  218.                         + " das global beste Ergebnis: " + value + ".");
  219.                 this.interactiveExploration();
  220.             } else if (where.equals("GLOB") && what.equals("MIN")) {
  221.  
  222.                Vector<Object> max = se.getGlobalMinimum();
  223.                 Dataset da = (Dataset) max.get(1);
  224.                 String name = (String) max.get(0);
  225.                 Date d = da.getDate();
  226.                 double value = da.getLow();
  227.  
  228.                 System.out.println(name + " erzielte am " + d
  229.                         + " das global schlechteste Ergebnis: " + value + ".");
  230.                 this.interactiveExploration();
  231.             } else if (where.equals("GLOB") && what.equals("AVG")) {
  232.                double value = se.getGlobalAverage();
  233.                 System.out.println("Der globale Durchschnitt aller Werte ist "
  234.                         + value + ".");
  235.                 this.interactiveExploration();
  236.             } else if (where.equals("LOK")) {
  237.                 ArrayList<String> keys = this.findKeys();
  238.                 System.out.println("Wie ist der Name der Aktie?");
  239.                 String name = null;
  240.  
  241.                 try {
  242.                     name = br.readLine();
  243.                 } catch (IOException e) {
  244.                     e.printStackTrace();
  245.                     this.interactiveExploration();
  246.                     return;
  247.                 }
  248.  
  249.                 if (name.equals("EXIT")) {
  250.                     return;
  251.                 } else if (what.equals("MAX") && keys.contains(name)) {
  252.                    double value = se.getLocalMaximum(name).getHigh();
  253.                     Date d = se.getLocalMaximum(name).getDate();
  254.                     System.out.println("Ergebnis: " + "am " + d + " erzielte "
  255.                             + name + " ein Maximum von " + value + ".");
  256.                     this.interactiveExploration();
  257.                 } else if (what.equals("MIN") && keys.contains(name)) {
  258.                    double value = se.getLocalMinimum(name).getLow();
  259.                     Date d = se.getLocalMinimum(name).getDate();
  260.                     System.out.println("Ergebnis: " + "am " + d + " erzielte "
  261.                             + name + " ein Minimum von " + value + ".");
  262.                     this.interactiveExploration();
  263.                 } else if (what.equals("AVG") && keys.contains(name)) {
  264.                    double value = se.getLocalAverage(name);
  265.                     System.out.println("Ergebnis: " + name
  266.                             + " erzielte ein durchschnittliches Ergebnis von "
  267.                             + value + ".");
  268.                     this.interactiveExploration();
  269.                 } else {
  270.                     System.out
  271.                             .println("Entschuldigung, aber zu einer "
  272.                                     + "solchen Aktie liegen keine Daten vor.");
  273.                     this.interactiveExploration();
  274.  
  275.                 }
  276.             } else {
  277.                 System.out
  278.                         .println("Unbekannter Befehl - "
  279.                                 + "moegliche Befehle sind GLOB und LOK.");
  280.                 this.interactiveExploration();
  281.             }
  282.         } else {
  283.             System.out
  284.                     .println("Unbekannter Befehl - "
  285.                             + "moegliche Befehle sind MIN, MAX und AVG.");
  286.             this.interactiveExploration();
  287.         }
  288.     }
  289.  
  290.     private ArrayList<String> findKeys() {
  291.         ArrayList<String> keys = new ArrayList<String>();
  292.         Set<String> keyset = se.getDB().getAllData().keySet();
  293.         Iterator<String> it = keyset.iterator();
  294.  
  295.         while (it.hasNext()) {
  296.  
  297.             String share = it.next().toString();
  298.             keys.add(share);
  299.  
  300.         }
  301.         return keys;
  302.     }
  303.  
  304.     /**
  305.      * Eine main-Methode zum testen Ihrer Implementierung. Zunaechst prueft die
  306.      * Methode, ob genau 2 Parameter als Argumente uebergeben wurden. Ist dies
  307.      * nicht der Fall, wird die Meldung Das Programm erwartet genau 2 Parameter:
  308.      * den Modus, sowie die Angabe der Daten-Datei. ausgegeben. Andernfalls wird
  309.      * abgefragt, welcher der Explorationsmodi (byName oder interactive)
  310.      * durchgefuehrt werden soll und die entsprechende Methode (s.o.) startet
  311.      * die Exploration. Wurde kein gueltiger Modus als Argument uebergeben, soll
  312.      * das Programm die Meldung Fehlerhafter Parameter. ausgegeben werden.
  313.      *
  314.      * @param args Parameter
  315.      */
  316.     public static void main(String[] args) {
  317.  
  318.         if (args.length != 2) {
  319.             System.out
  320.                     .println("Das Programm erwartet genau 2 Parameter: den "
  321.                             + "Modus, sowie die Angabe der Daten-Datei.");
  322.         } else {
  323.             ShareExploration s = new ShareExploration(args[1]);
  324.             CLShareExploration cls = new CLShareExploration(s);
  325.             if (args[0].equals("byName")) {
  326.                 cls.selectByStockName();
  327.             } else if (args[0].equals("interactive")) {
  328.                 cls.interactiveExploration();
  329.             } else {
  330.                 System.out.println("Fehlerhafter Parameter.");
  331.             }
  332.         }
  333.     }
  334. }