Guest
Public paste!

Untitled

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