Persistente Datenhaltung

Status
Nicht offen für weitere Antworten.

isabell

Mitglied
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

Top Contributor
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
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Persistente Datenspeicherung Android & Cross-Platform Mobile Apps 5

Ähnliche Java Themen

Neue Themen


Oben