# Persistente Datenhaltung



## isabell (28. Apr 2008)

Hallo Leute ,

kann mir jemand helfen? Habe ein dickes Problem!Ich muss bis Mitwoch ein midlet mit folgenen funktionen erweitern:

Wenn möglich Eingabe (Calculate-Funktionalität) über Select-Button ermöglichen

Wiederholungen von History-Einträgen vermeiden, erneut aufgerufene Einträge sollen in der Liste an erste Stelle verschoben werden

Das ist das Midlet:


import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class CalculatorMidlet extends MIDlet 
        implements CommandListener, ItemCommandListener, ItemStateListener {

  Display display;

  Form form = new Form("Calculator");
  TextField input  = new TextField( "Eingabe", "", 100 , TextField.ANY );
  TextField output = 
    new TextField( "Ergebnis", "", 100 , TextField.UNEDITABLE );
  ChoiceGroup inputHistory;

  Command cmdExit      = new Command( "TschÃ¼ss", Command.EXIT, 0 );
  Command cmdCalculate = new Command( "Calculate", Command.SCREEN, 0 );

  public CalculatorMidlet() {
    inputHistory = new ChoiceGroup( "Recent Tasks", Choice.POPUP );
    inputHistory.setItemCommandListener(this);

    form.append(input);
    form.append(inputHistory);
    form.append(output);

    form.setItemStateListener(this);

    form.addCommand(cmdExit);
    form.addCommand(cmdCalculate);
    form.setCommandListener(this);
  }

  public void startApp() {
    display = Display.getDisplay(this);
    display.setCurrent(form);
  }

  public void pauseApp() {
    System.out.println("pauseApp() called");
  }

  public void destroyApp(boolean unconditional) {
    System.out.println("destroyApp() called");
  }

  public void commandAction(Command cmd, Displayable arg1) {
    if( cmd == cmdExit ) {
      destroyApp(true);
      notifyDestroyed();
    }
    else if( cmd == cmdCalculate ) {
      try{ 
        String in = input.getString();
        float f = calculate( in );
//        inputHistory.append( in, null );
        inputHistory.insert( 0, in, null );
        output.setString( "" + f );
        input.setString( "" );
      } catch( Exception e ) {
        Alert alert = new Alert( "Falsche Eingabe", 
          "Exception:" + e.getMessage(), null, AlertType.WARNING );
        display.setCurrent(alert);
      }
//      input.setString( "" );
    }
  }


  /**
   * Berechnet den Float-Wert fÃ¼r das Ergebnis einer durch einen String
   * reprÃ¤sentierten Rechenaufgabe. Es gilt Punkt- vor Strichrechnung.
   * Klammern kÃ¶nnen benutzt werden.
   * 
   * @param in String, der eine Rechenaufgabe darstellt.
   * @return Ergebnis der Aufgabe.
   * @throws NumberFormatException Falls der String keine sytaktisch korrekt
   * interpretierbare Rechenaufgabe darstellt.
   */ 
  public static float calculate( String in ){
    Object[] ff_str = firstFloatAndRest(in);

    float f = ((Float)ff_str[0]).floatValue();
    in = (String)ff_str[1];

    in = in.trim();
    while( in.length() > 0 ) {
      char op = in.charAt(0);

      if( op == '+' )
        return f + calculate(in.substring(1));
      else if( op == '-' )
        return f - calculate(in.substring(1));

      in = in.substring(1);
      ff_str = firstFloatAndRest(in);
      float f2 = ((Float)ff_str[0]).floatValue();
      if( op == '*' )
        f *= f2;
      else if( op == '/' )
        f /= f2;
      else
        throw new NumberFormatException();
      in = (String)ff_str[1];
      in = in.trim();      
    }
    return f;
  }


  /**
   * Extrahiert den ersten zusammenhÃ¤ngenden Teil des Eingabestrings,
   * der einen Float-Wert darstellt. Entweder eine StringreprÃ¤sentation
   * eines Float-Werts oder eines zusammengsetzten Ausdrucks, der durch einen
   * Klammerausdruck definiert ist.
   * 
   * @param in String, der eine Rechenaufgabe darstellt.
   * @return Float-Wert des kleinsten zusammenhÃ¤ngenden AnfangsstÃ¼cks des
   * Eingabestrings und Rest des Strings.
   * @throws NumberFormatException Falls der String keine sytaktisch korrekt
   * interpretierbare Rechenaufgabe darstellt.
   */ 
  public static Object[] firstFloatAndRest( String in ) {
    in = in.trim();

    float f = 0;
    int i = in.length();
    for( ; i>0; --i ){
      try{ 
        Float.parseFloat( in.substring(0, i) );
      }catch( Exception ex ) {
        continue;
      }
      break;
    }
    if( i > 0 )
      // in = "float" op ....
      f = Float.parseFloat(in.substring(0, i));
    else {
      // in = (...) op ...
      // in = -(...) op ...
      float sign = 1;
      if( in.charAt(0) == '-' ){
        sign = -1;
        in = in.substring(1);
        in = in.trim();
      }
      else if( in.charAt(0) == '+' ){
        in = in.substring(1);
        in = in.trim();
      }
      i = indexEndMatchingBrace( in );
      f = sign*calculate( in.substring(1, i) );
      i++;
    }
    return new Object[]{ new Float(f), in.substring(i) };
  }


  /**
   * Sucht die entsprechende schliessende Klammer in einem String, der mit
   * einer Ã¶ffnenden Klammer beginnt.
   * 
   * @param str Ein String, der mit einer Ã¶ffnenden Klammer beginnt.
   * @return Index der zum ersten Zeichen korrepondierenden schlieÃŸenden
   * Klammer.
   * @throws NumberFormatException Falls der String nicht mit einer Ã¶ffnenden
   * Klammer beginnt oder keine korrespondierende schliessende Klammer
   * vorhanden ist.
   */
  public static int indexEndMatchingBrace( String str ) {
    char[] openBraces  = new char[]{ '(', '[', '{' };
    char[] closeBraces = new char[]{ ')', ']', '}' };
    char b1 = 0;
    char b2 = 0;

    for( int i=0; i < openBraces.length; ++i ){
      if( str.charAt(0) == openBraces_ ){
        b1 = openBraces;
        b2 = closeBraces;
        break;
      }
    }
    if( b1 == 0 )
      throw new NumberFormatException( 
        "indexEndMatchingBrace: " + str + "\nNo starting brace!" );

    int ind1 = 0;
    int ind2 = 0;
    while( true ) {
      ind2 = str.indexOf(b2, ind2+1);
      if( ind2 == -1)
        throw new NumberFormatException( "indexEndMatchingBrace: " + str );
      ind1 = str.indexOf(b1, ind1+1);
      if( ind1 == -1 || ind1 > ind2 )
        return ind2;
    }
  }

  // ItemCommandListener
  public void commandAction(Command arg0, Item arg1) {
      System.out.println( "ItemCommandListener.commandAction called" );
  }

  // ItemStateListener
  public void itemStateChanged(Item item) {
//      System.out.println( "ItemStateListener.itemStateChanged called" + item );
      if( item == inputHistory ) {
        String selected = 
          inputHistory.getString( inputHistory.getSelectedIndex() );
        input.setString(selected);
      }
  }
}_


----------



## Jockel (28. Apr 2008)

Um deine einzige Frage zu beantworten: Ja! Weitere Fragen?


----------



## isabell (28. Apr 2008)

Dann verate mir mal deine Lösung.


----------



## isabell (28. Apr 2008)

Achso Jungs ich hab ganz vergessen das ist nenn Taschenrechner - Programm!


----------



## Jockel (28. Apr 2008)

Auch wenn's vergebene Liebesmüh' ist:
http://catb.org/~esr/faqs/smart-questions.html
Und nochmal auf deutsch:
http://www.tty1.net/smart-questions_de.html
Danach können wir (ggf.) weiter reden.


----------



## isabell (28. Apr 2008)

wenn du  mir nichmal helfen willst,dann musst du mich aber auch nicht verunsichern!


----------



## Jockel (29. Apr 2008)

Wie zu erwarten, hast du scheinbar den Artikel nicht durchgelesen! Daher ein paar Punkte auf dem Silbertablett, warum du hier (bisher) keine Hilfe bekommst:
- Titel ist irreführend
- Keine konkrete Frage gestellt (bis auf eine, die schon beantwortet wurde)
- zuviel Source
- dieser auch noch ohne Source-Tags
- impliziter Aufruf, Hausaufgaben für einen selbst zu machen
- zu faul zum lesen


----------

