String vergleichen mit Stack < Java < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 00:50 So 05.12.2010 | Autor: | Fatih17 |
Hallo,
ich habe einen Stack voll mit Objekten (Notebooks). Jetzt kann der Benutzer die Notebooks per Eingabe nach Marke filtern.
Leider weiß ich nicht welchen Befehl ich dazu verwenden soll.
Die Objekte bestehen aus verschiedenen Strings und Integern und es soll halt geschaut werden ob die Eingabe mit den Marken der Objekte übereinstimmt, falls es welche gibt, sollen diese angezigt werden.
Vielen Dank im voraus
Fatih
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 03:57 So 05.12.2010 | Autor: | felixf |
Moin Fatih!
> ich habe einen Stack voll mit Objekten (Notebooks). Jetzt
> kann der Benutzer die Notebooks per Eingabe nach Marke
> filtern.
>
> Leider weiß ich nicht welchen Befehl ich dazu verwenden
> soll.
Nun, du wirst wohl eine Reihe von Befehlen verwenden muessen. Am besten schreib dir eine Funktion dafuer.
> Die Objekte bestehen aus verschiedenen Strings und Integern
> und es soll halt geschaut werden ob die Eingabe mit den
> Marken der Objekte übereinstimmt, falls es welche gibt,
> sollen diese angezigt werden.
Daraus wird weder klar, wie die Datenstruktur genau aussieht, noch, wie die Objekte genau aussehen. Insofern kann ich dir nicht wirklich helfen.
Schreibe eine Funktion, die alle Elemente auf dem Stack durchlaeuft. Fuer jedes Element vergleichst du die Marken der Objekte mit der Eingabe uebereinstimmt. Findest du etwas, gibst du das Objekt aus.
(Ja, das ist nicht viel mehr als das, was du selber schon schriebst. Ohne weitere Informationen deinerseits koennen wir aber auch nichts genaueres sagen...)
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 12:55 So 05.12.2010 | Autor: | Fatih17 |
Hallo nochmal,
wenn ich den ganzen Code reinschreiben würde, wäre das zu viel, deswegen schreibe ich nur den Teil rein, der Wichtig ist.
Folgender Stack wird genutz:
Stack <Object> handys =new Stack <Object>();
Jetzt werden Objekte eingefügt:
Handy L=new Handy(123456,"Samsung","Galaxy S","Android","schwarz",8,8,1000,256);
Handy K=new Handy(123456,"Apple","iPHONE 4","MacOs","schwarz",5,16,1000,256);
Handy I=new Handy(123456,"Apple","iPHONE 3GS","MacOs","weiß",3,16,500,128);
handys.push(I);
handys.push(K);
handys.push(L);
Und nun die Eingabe des Benutzers:
System.out.println("Welche marke?:");
String eingabe4= In.readWord();
if(eingabe4.equals(handys.elements()))
Hier soll bei Eingabe von IPHONE die beiden IPHONE Objekte ausgegeben werden
|
|
|
|
|
Hi!
Jede Stack-Implementierung beherrscht an sich die push() und pop() Operation. Je nach dem ob Du nun eine eigene / vom Lehrer vorgegebene / was auch immer benutzt oder die Stack-Implementierung aus der API nutzt, variieren die Befehle etwas, aber der Grundaufbau ist gleich:
sucheImStack(alterStack, suchString)
- kopiere alterStack in tempStack
- erschaffe RückgabeStack
- solange tempStack nicht leer
- if oberstesElement auf tempStack == suchString
- RückgabeStack.push(oberstesElement)
-tempStack.pop()
- return RückgabeStack
Du kannst jede beliebige Datenstruktur nehmen, um die entsprechenden Elemente, die die Suchanfrage erfüllen, abzuspeichern / zurückzugeben. Ich habe oben einfach auch mal einen Stack genommen.
Da Java mit Referenzen (Call by Value vs Call by Reference) arbeitet musst du "alterStack" kopieren, damit du die Handys nicht durch den push() Befehle löscht. Genauso musst du aufpassen, dass du Strings nicht per "==" vergleichen kannst. Schau hierzu dann auch mal in die Java API bzw. nach String.equals().
Hoffe das hilft dir weiter
P.S. Den API Eintrag findest du hier Der "peek" Befehl könnte auch ganz nützlich für dich sein ;)
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:34 So 05.12.2010 | Autor: | felixf |
Moin,
> Jede Stack-Implementierung beherrscht an sich die push()
> und pop() Operation. Je nach dem ob Du nun eine eigene /
> vom Lehrer vorgegebene / was auch immer benutzt oder die
> Stack-Implementierung aus der API nutzt, variieren die
> Befehle etwas, aber der Grundaufbau ist gleich:
>
> sucheImStack(alterStack, suchString)
> - kopiere alterStack in tempStack
> - erschaffe RückgabeStack
> - solange tempStack nicht leer
> - if oberstesElement auf tempStack == suchString
> - RückgabeStack.push(oberstesElement)
> -tempStack.pop()
> - return RückgabeStack
sowas sollte man nur bei einer sehr, sehr schlechten Stack-Implementation machen muessen.
Die Stack<>-Implementation aus der API implementiert etwa java.util.AbstractList, womit man die Elemente einfach enumerieren kann.
> Genauso musst du aufpassen, dass du Strings nicht per "=="
> vergleichen kannst. Schau hierzu dann auch mal in die Java
> API bzw. nach String.equals().
Das hilft bei dieser Aufgabe ebenfalls nicht, da man nach Teilstrings suchen muss (unabhaengig von Gross- und Kleinschreibung).
LG Felix
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:51 So 05.12.2010 | Autor: | Pille456 |
Laufzeittechnisch sehe ich keinen da keinen Unterschied, beide arbeiten mit O(n) Zeit, weil man sowieso jedes Objekt betrachten muss.
Es ist lediglich eine Designfrage, was man schöner findet und eventuell was momentan einfacher (zu implementieren) ist. Wenn es eine Schulaufgabe ist, denke ich würde der Lehrer eher sowas sehen wollen, wie meinen Vorschlag, da es ja um den Gebrauch von einem Stack geht.
Der versierte Java-Programmierer würde wahrscheinlich eher zu Deiner Methode greifen, weil sie einfacher zu implementieren ist, wahrscheinlich bzgl. einiger konstanter Faktoren schneller wäre und die Richtigkeit der Implementierung sich direkt aus "der Richtigkeit" der Funkionen der API ableitet.
Gut das mit den Teilstrings ist mir durchgegangen, das tut mir Leid. Dann muss man halt mal in der Java API schauen, welche netten Methoden es noch für Strings gibt. Das sollte nicht so schwer sein
Gruß
Pille
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 22:19 So 05.12.2010 | Autor: | felixf |
Moin Pille,
> Laufzeittechnisch sehe ich keinen da keinen Unterschied,
> beide arbeiten mit O(n) Zeit, weil man sowieso jedes Objekt
> betrachten muss.
von der asymptotischen Laufzeit her macht es keinen Unterschied, da hast du Recht.
Von der praktischen Laufzeit macht es jedoch einen grossen Unterschied. Und vom Speicherverbrauch ebenfalls!
> Wenn es eine Schulaufgabe ist, denke ich würde der Lehrer
> eher sowas sehen wollen, wie meinen Vorschlag, da es ja um
> den Gebrauch von einem Stack geht.
Dann muss man allerdings erstmal eine Kopie vom Stack anlegen. Wenn man nur pushen und poppen kann, ist das nicht mehr so ganz nicht-trivial.
> Der versierte Java-Programmierer würde wahrscheinlich eher
> zu Deiner Methode greifen, weil sie einfacher zu
> implementieren ist, wahrscheinlich bzgl. einiger konstanter
> Faktoren schneller wäre und die Richtigkeit der
Nicht nur wahrscheinlich. Es ist schneller.
Es muss zusaetzlich Speicher allokiert werden (langsam), es wird der Stack erstmal kopiert, und dann wird der Stack durchlaufen.
> Gut das mit den Teilstrings ist mir durchgegangen, das tut
> mir Leid. Dann muss man halt mal in der Java API schauen,
> welche netten Methoden es noch für Strings gibt. Das
> sollte nicht so schwer sein
Das duerfte recht einfach sein :) Die Java-API ist so ueberladen dass es dafuer sicher etwas passendes gibt
LG Felix
|
|
|
|