ArrayList - max. Größe festlegen?

Neue Frage »

Gast11022013 Auf diesen Beitrag antworten »
ArrayList - max. Größe festlegen?
Meine Frage:
Man benutzt ja in Java ArrayList, wenn man nicht so genau weiß, wieviele Elemente zu einer Liste hinzukommen werden, d.h. immer dann, wenn die Größe veränderbar sein soll.


Wie ist das im folgenden Beispiel:


In einer Kneipe sind mehrere Bereiche, z.b. Theke und Tür.

In jedem Bereich gibt es eine bestimmte Anzahl von Sitzplätzen und eine Gästeliste.


Hier ist es ja so, daß die Gästeliste für einen Bereich nach oben beschränkt ist, aber ein Array kann man nicht nehmen, weil ja auch weniger Leute kommen können.


Kann man bei ArrayList die maximale Größe nach oben festlegen??

Wenn zum Beispiel 15 Stühle da sind, können maximal 15 Gäste kommen, aber eben auch weniger, weswegen es keinen Sinn machen würde ein Array von 15 zu benutzen.

Kann man ein ArrayList - Objekt anlegen und dabei sagen: max. 15 oder weniger? Wie würde das funktionieren?


Gibt es sowas?

Meine Ideen:
...
T0b1a5 Auf diesen Beitrag antworten »

Was du möchtest ist eine Liste mit begrenzten Elementen. So etwas bietet Java m.E. nicht, denn das kannst du dir doch schnell selber schreiben Augenzwinkern
Nimm dir eine Klasse, ein Array und einen maximalen Wert und dann kannst du solange Element in dein Array anfügen, wie die Länge kleiner als dein maximaler Wert ist. Ein Array kannst du durch duplizieren vergrößern Augenzwinkern

Hilft das, oder brauchst du mehr Code?
 
 
Gast11022013 Auf diesen Beitrag antworten »

Im Grunde verstehe ich schon, was Du meinst.

Aber es geht um Folgendes.


Es soll das Nachtleben in einer Bar simuliert werden und dafür gibt es zunächstmal eine Klasse Array, die einen Bereich einer Bar festlegt (Eine Bar soll drei Bereiche haben: Tür, Theke, Bühne).

Ein Bereich soll eine bestimmte Größe haben (an Sitzplätze), einen Namen sowie eine Liste, in der sich Gäste eintragen können und diese Liste kann ja nicht länger sein als die Anzahl der Stühle in dem Bereich.


Wie realisiert man eine solche Klasse??

Eine Idee:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
import java.util.List;
import java.util.ArrayList;

public class Area{
int size;
String name;
List<Guest> guests;



Guest ist eine weitere Klasse.

Aber wo fließt hier mit ein, daß die Länge der Liste nicht größer sein kann, als die Anzahl der Stühle??
Math1986 Auf diesen Beitrag antworten »

Ich verstehe das Problem nicht.
Du kannst doch eine ArrayList verwenden und deren Größ (size()) vor dem Einfügen eines Elementes abfragen.
Damit kannst du dir deine eigene Einfügemethode schreben.
Gast11022013 Auf diesen Beitrag antworten »

Das Problem ist, daß an dieser Klasse Aray andere Klassen hängen sollen (Bar, Guest...) und ich gar nicht weiß, wie ich jetzt vorgehen soll.


verwirrt


Ich hab diese Frage aber in aller Ausführlichkeit schon woanders gestellt (nur das, was ich hier gefragt habe nicht) und deswegen wäre es Crossposting, wenn ich die ganze Aufgabe jetzt hier nochmal stellen würde.
T0b1a5 Auf diesen Beitrag antworten »

Dann poste nur den Link Augenzwinkern Ich verstehe jetzt weniger von der Aufgabe als nach dem ersten Post.
Gast11022013 Auf diesen Beitrag antworten »

Ich glaube, man darf das hier nicht. Dann wird glaube ich der ganze Thread gesperrt.

Leider. Ich würde es gerne verlinken.
Math1986 Auf diesen Beitrag antworten »

An welcher Klasse sollen andere Klassen hängen? verwirrt

Ich dachte an sowas wie
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
import java.util.List;
import java.util.ArrayList;

public class Area
{
   int size;
   String name;
   protected List<Guest> guests;

   public void addGuest(int index,Guest g)
   {
       if(guests.size()<size)
      {
          guests.add(index,g);
     }
   }
}


Dann darfst du halt nur über diese Methode Gäste hinzufügen, und jede Klasse hat ihre eigene ArrayList

Ich verstehe das Problem immer noch nicht unglücklich
Gast11022013 Auf diesen Beitrag antworten »

Es geht um das Simulieren des Nachtlebens in einer Bar.

Und ich weiß nicht, ob ich diese Methode in der Klasse Area überhaupt dort schreiben soll oder nicht vieleicht in einer der vielen anderen Klassen, die in diesem Modell enthalten sind.


Die Umschreibung der Klasse Area lautet so:

Schreibt eine Klasse Area, die solch einen Bereich darstellt. Jeder Bereich zeichnet sich dadurch
aus, dass eine bestimmte Anzahl an Sitzplatzen vorhanden ist. Auerdem hat eine Area
einen Namen (also Buhne etc.) und eine Liste mit Gasten. Naturlich darf die Groe der Liste
nicht die Anzahl der Sitzplatze uberschreiten.



---

Im nächsten Schritt soll eine Klasse Bar geschrieben werden:

Bar Entwickelt weiterhin eine Klasse Bar, die jeweils die drei oben genannten Bereiche beinhaltet.
Beim Erstellen eines Objektes der Klasse Bar (also im Konstruktor) wird ubergeben,
welchem Bereich wie viele Sitzplatze zugesichert werden. Diese Anzahl kann sich nach dem Konstruktoraufruf
nicht mehr verandern (Begrundet hier eure Vorgehensweise). Zusatzlich ist die
Anzahl der Personen einer Kneipe beschrankt. Es kann nur so viele Gaste geben, wie es auch
Sitzplatze gibt. Die maximale Anzahl der Kellner entspricht der Anzahl der Sitzplatze durch
funf, mindestens jedoch 3. Live-Bands mit mehr als funf Musikern passen nicht auf die Buhne.
Um eine gute Trennung zu ermoglichen, enthalt jede Bar zwei Listen. Zum Einen eine fur die
Kellner, zum Anderen eine fur die Musiker.







So und ich weiß jetzt nicht, wo ich welche Methoden brauche.

Wo muss ich das mit der Listenlänge umsetzen? In Area oder in Bar?
Cel Auf diesen Beitrag antworten »

@Dennis2010: Wieso postest du das in HS-Sonstiges? Es hat hier nichts zu suchen und das erste Mal ist das auch nicht. Ich werde den Thread verschieben. Weiterhin frage ich mich, wieso du wider besseren Wissens im Matheboard Informatikthreads eröffnest.

Sicher, das Informatikerboard ist nicht so rege besucht wie wir hier. Dennoch gilt es, die Aufteilungen einzuhalten. Gerade du als Moderator des Deutschboards solltest das verstehen.
T0b1a5 Auf diesen Beitrag antworten »

Du wirfst uns hier nur Bröckchen deiner Aufgabe hin und wir sollen dir bei deiner Modellierung helfen? Lehrer

Ich verstehe immer noch Bahnhof :\ Kannst du deinen Beitrag editieren und die ganze Aufgabe anfügen, damit man auch den Rahmen kennt?
Gast11022013 Auf diesen Beitrag antworten »

Wie gesagt, ich habe diese Aufgabe bereits in einem anderen Forum in aller Länge gestellt und ich darf es hier nicht wiederholen, da das Crossposting wäre.

Ich mache es aber jetzt trotzdem, auch auf die Gefahr hin, daß es umsonst ist.



In den folgenden Aufgaben geht es darum, das Nachtleben einer Kneipe zu simulieren. Wie
bei einer echten Kneipe konnen Gaste eine Kneipe betreten, verlassen, Getranke bestellen etc.
Naturlich sind nicht alle Gaste gleich, einige von ihnen konnen sich bei erhohtem Alkoholkonsum
nicht benehmen und werden aus der Kneipe geworfen. Andere Gaste wiederum sind beruhmt und
werden als VIP's behandelt. Neben Gasten gibt es aber auch Kellner, welche die Gaste bedienen.
Und was darf jeder Kneipe nicht fehlen? Genau: eine Live-Band. Diese ist also ebenfalls in der
Kneipe vertreten.


Aufgabe 1 Die Grundlagen

Area
Alle Kneipen sind gleich aufgebaut. Es gibt eine Buhne, eine Theke und eine Tur.
Naturlich sind einige Platze begehrter als andere. Gaste bevorzugen die Buhne, mit der Theke
geben sie sich auch noch zufrieden. Am unbeliebtesten ist der Bereich um die Tur.
Schreibt eine Klasse Area, die solch einen Bereich darstellt. Jeder Bereich zeichnet sich dadurch
aus, dass eine bestimmte Anzahl an Sitzplatzen vorhanden ist. Auerdem hat eine Area
einen Namen (also Buhne etc.) und eine Liste mit Gasten. Naturlich darf die Groe der Liste
nicht die Anzahl der Sitzplatze uberschreiten.


Bar

Entwickelt weiterhin eine Klasse Bar, die jeweils die drei oben genannten Bereiche beinhaltet.
Beim Erstellen eines Objektes der Klasse Bar (also im Konstruktor) wird ubergeben,
welchem Bereich wie viele Sitzplatze zugesichert werden. Diese Anzahl kann sich nach dem Konstruktoraufruf
nicht mehr verandern (Begrundet hier eure Vorgehensweise). Zusatzlich ist die
Anzahl der Personen einer Kneipe beschrankt. Es kann nur so viele Gaste geben, wie es auch
Sitzplatze gibt. Die maximale Anzahl der Kellner entspricht der Anzahl der Sitzplatze durch
funf, mindestens jedoch 3. Live-Bands mit mehr als funf Musikern passen nicht auf die Buhne.
Um eine gute Trennung zu ermoglichen, enthalt jede Bar zwei Listen. Zum Einen eine fur die
Kellner, zum Anderen eine fur die Musiker.


Person

Jeder der eine Kneipe besucht (ob nun als Gast, Kellner oder Musiker) ist eine Person.
Alle Personen haben einen Namen (welcher im Konstruktor ubergeben wird) und konnen eine
Kneipe betreten und wieder verlassen (Methode enter(Bar bar) und leave()). Jede Person wei,
in welcher Kneipe sie sich be ndet, hat also ein Attribut von Typ Bar. Ist eine Person in keiner
Kneipe, so ist dieses Attribut = null. Weiterhin spezi ziert eine abstrakte Methode doSomething().
Diese wird von der konkreten Person (also dem Gast, dem Kellner etc.) implementiert
und stellt eine Aktion innerhalb der Kneipe dar.
Immer wenn etwas passiert (ein Gast bestellt z.B. ein Getrank), soll eine Ausgabe auf der Konsole
erscheinen mit Namen der Person und der gerade ausgeubten Tatigkeit.
Ziel ist es, am Ende anhand der Ausgaben nachvollziehen zu konnen, was in der Kneipe so
passiert.


Guest

Ein Gast ist eine Person. Wenn er die Kneipe betritt, versucht er zunachst einen Platz
bei der Buhne zu bekommen. Sind dort schon alle Sitzplatze belegt, so versucht er es weiter bei
der Theke. Ist dort ebenfalls alles besetzt, so versucht er es bei der Tur. Ist gar kein Platz mehr
frei, so muss der Gast leider drauen bleiben. Wurde ein freier Platz gefunden, so tragt sich der
Gast in die Liste des jeweilig gewahlten Bereichs ein. Ein Gast kann, sofern er in einer Kneipe ist,
sich entschlieen diese wieder zu verlassen (wird in der Methode doSomething() ausgefuhrt). Die
Auswahl, ob er dies tut oder nicht, ndet zufallig statt. Zufallswerte lassen sich mit der Methode
random der Klasse Math erzeugen (also Math.random()). Verlasst ein Gast eine Kneipe, so muss
er aus der jeweiligen Liste entfernt werden


Musician

Ein Musiker ist eine Person. Er besitzt immer ein Instrument, welches im Konstruktor
ubergeben wird. Beim Aufruf der Methode doSomething() gibt er an, welches Instrument er
gerade spielt. Beim Betreten der Kneipe wird der Musiker in die Liste fur die Musiker eingetragen.


Main

Die Klasse Main erzeugt eine Kneipe und fullt diese mit Personen. Die Klasse Main
erzeugt eine Kneipe und fullt diese mit Personen. Damit etwas in der Kneipe passieren kann,
gibt es eine Schleife die fur jede Person doSomething() aufruft. Zur Umsetzung dieser Schleife
sollten alle Referenzen der erzeugten Personen in dieser Klasse gespeichert sein.
In der bereits vorgegebenen Klasse Main be ndet sich eine statische Methode waitFor(long millis).
Diese Methode sorgt dafur, dass das Programm eine bestimmte Zeit wartet, bevor es weiter
arbeitet (Angaben in Millisekunden). Verwendet diese Methode, um die Konsolenausgaben etwas
zu verzogern.


Aufgabe 2 Endlich gibt es was zu Trinken
Drink Ein Getrank hat einen Namen, Kosten und einen Alkoholgehalt. Entwickelt hierfur eine
Klasse Drink.
Menu Die Karte unserer Kneipe enthalt nur Getranke. Gebt einige Getranke vor und bietet
sie als statische Attribute der Klasse Menu an.
Waiter Ein Kellner ist eine Person. Wie bereits erwahnt, kann ein Kellner eine Bestellung
entgegen nehmen und diese bearbeiten (vgl. Punkt Bestellung). Die Methode doSomething hat
keinen E ekt bei einem Kellner. Kellner tragen sich beim Betreten der Bar in die entsprechende
Liste fur Kellner ein.
Bestellungen Damit nun Gaste auch Getranke bestellen konnen, erweitert die Klasse Bar um
eine Methode order(Drink drink, Guest guest). Wird diese Methode durch einen Gast aufgerufen,
(dies soll ebenfalls zufallig in doSomething() passieren, bei dem Getrank handelt es sich um ein
Getrank aus der Klasse Menu) wird ein zufalliger Kellner ausgesucht und diese Bestellung an
ihn weitergeleitet (serve(Drink drink, Guest guest)). Damit der Kellner dem Gast das Getrank
auch bringen kann, erweitert die Klasse Guest um die Methode give(Drink drink). Wird diese
Methode aufgerufen, so konsumiert der Gast das Getrank. Je mehr alkoholische Getranke ein
Gast trinkt, desto hoher wird sein Alkoholpegel. Damit die Kneipe auch Gewinn machen kann,
erhalt die Klasse Bar ein weiteres Attribut cashBox. Nachdem der Kellner nun also dem Gast
sein Getrank gebracht hat, legt er das Geld fur dieses Getrank in die Kasse. Der Einfachheit
halber gehen wir davon aus, dass ein Gast unendlich viel Geld bei sich hat.
2
PI 1, WiSe 2011/2012
Aufgabe 3 Manche Gaste sind eben anders als Andere (15%)
VIP Ein VIP ist ein Gast. Der VIP ist in der Lage andere Gaste von ihren Platzen zu
"
vertreiben\,
sofern kein freier Platz mehr vorhanden ist. Dazu wahlt er einen zufalligen Gast aus
der Liste der jeweiligen Area und verdrangt diesen anschlieend. Um dies zu realisieren benotigt
die Klasse Gast eine Methode kick(). Gaste suchen sich anschlieend einen freien Platz auf der
nachsten Area (also z.B. bei der Theke) und setzten sich dort hin. Ist nichts mehr frei, so verlasst
der Gast die Kneipe. Handelt es sich bei dem
"
vertriebenen\ Gast wiederum um einen VIP, so
geht dieser in den nachsten Bereich und vertreibt dort ggf. einen anderen Gast. Wird ein VIP
aus dem Bereich Tur vertrieben, so verlasst er, genau wie ein normaler Gast, die Kneipe. Wie
konnte man verhindern, dass ein VIP andere VIPs vertreibt?
Roughneck In jeder Kneipe gibt es schwarze Schafe. Einige der Gaste werden daher unangenehm,
wenn sie zu viel Alkohol getrunken haben. Jedoch reagieren die Personalkrafte stets
rechtzeitig. Wenn ein Raufbold genugend Alkohol getrunken hat, wirft er einen Stuhl um (oder
vlt. sogar durch die Gegend) und wird von einer zufalligen Personalkraft aus der Kneipe entfernt.
Dazu erweitert die Klasse Bar um die Methode throwChair(Roughneck roughneck) und die
Klasse Waiter um die Methode kickRoughneck(Roughneck roughneck). Raufbolde sind wahre
Trinker. Sie bestellen viel hau ger als normale Gaste neue Getranke.
Testen
Testet eure Implementierung, indem ihr einen Durchgang protokolliert und an einigen Punkten
beschreibt, warum eine bestimmte Ausgabe erschienen ist.
Hinweis
Im Anhang zu dieser Aufgabe ndet ihr ein UML-Klassendiagramm, welches zur Ubersicht der
Klassenstruktur verwendet werden kann. Es legt keinen Wert auf Vollstandigkeit und absoluter
Korrektheit. Sinnvolle Erweiterungen sind daher vorstellbar.
3
Gast11022013 Auf diesen Beitrag antworten »

Hallo, ich nochmal!

Wink


Ich poste mal meine bisherigen Ideen.
Wenn sich jemand die Mühe machen würde, sie anzusehen und sie mit der oben geposteten Aufgabenformulierung zu vergleichen, würde ich mich riesig freuen, da ich wirklich kein Experte in diesen Dingen bin, mir aber immerhin Mühe gebe.

(Die Werbung sagt: Mühe allein reicht nicht... Teufel )


Hier meine Idee zur Klasse Area:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
import java.util.List;
import java.util.ArrayList;

public class Area{

int size;
String name;
List<Guest>= new ArrayList<Guest>;


// Konstruktor, den ich glaube ich, für die Klasse Bar brauche
public Area(int size){
   this.size=size;
}

//Methoden, die man glaube ich später für die Klasse Guest braucht

public boolean addGuest(Guest g){

boolean untergekommen=false;
if(guests.size()<size){
   guests.add(g);
   untergekommen=true;
 }

return untergekommen;
}

public void deleteGuest(Guest g){
guests.remove(g);
}

}


Weiter geht es dann mit meiner Idee zur Klasse Bar (knüpft an den Code oben an):

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
public class Bar{

Area Stage;
Area Counter;
Area Door;
List<Waiter> waiter=new ArrayList<Waiter>;
List<Musician> musicians=new ArrayList<Musician>;
int maximumNumberOfWaiter;
int maximumNumberOfMusicians;
double cashBox;

public Bar(int sizeOfStage, int sizeOfCounter, int sizeOfDoor){

Stage= new Area(sizeOfStage);
Counter= new Area(sizeOfCounter);
Door= new Area(sizeOfDoor);
}

public void addWaiter(Waiter w){

  if( (waiter.size()<3) || (3<=waiter.size()<(sizeOfStage+sizeOfCounter+sizeOfDoor)/5) )
  {   
     waiter.add(w);
  }

public void deleteWaiter(Waiter w){
   waiter.remove(w);
}

public void addMusician(Musician m){
  if(musicians.size()<5){
   musicians.add(m);}

public void deleteMusician(Musician m){
   musicians.remove(m);
}

}


Weiter geht's mit meiner Idee zur Klasse Person:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
public class Person{
String name;
Bar bar=0;

public Person(String name){
this.name=name;
}

public void enter(Bar bar){
this.bar=bar;
}

public void leave(){
 bar=0;
}

abstract public void doSomething();
}


Bishierhin bin ich mir ja wenigstens noch einigermaßen sicher, jetzt wirds heikel.

Meine Idee zur Klasse Guest:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
public class Guest extends Person{

Area area;

public void doSomething(){

enter(bar);
Stage.addGuest(name);
 if(untergekommen==false){
     Counter.addGuest(name)}
         if(untergekommen==false){
             Door.addGuest(name)}
                       if(untergekommen==false){
                               leave();}
}

double a=Math.random();

if(a<0.5){
   leave();
}

}



Das schmerzt wahrscheinlich im Auge eines Programmierers, aber ich weiß es leider nicht besser!




Das sind meine bisherigen Ideen.
Ich hoffe sehr auf Hilfe.
tigerbine Auf diesen Beitrag antworten »

Zitat:
Wie gesagt, ich habe diese Aufgabe bereits in einem anderen Forum in aller Länge gestellt und ich darf es hier nicht wiederholen, da das Crossposting wäre.


Die gleiche Aufgabe hier einzustellen, ob komplett oder in Happen, das ist ein Crossposting. Wir haben dir auch schon mehrfach gesagt, dass wir diese nicht dulden. Es gehört sich einfach nicht, mehrere Leute mit seinem Problem zu beschäftigen. Leute helfen dir hier, weil sie auch denken, dass es bislang noch keiner getan hat.

Ebenso wurdest du darauf hingewiesen, dass diese Fragen ins www.informatikerboard.de gehören.

Helfer, die sich auskennen lade ich herzlich ein sich auch dort zu registrieren und zu helfen. Blumen

Aus Respekt vor den Helfern in diesem Thread lasse ich ihn offen. Die nächste Anfrage wird jedoch mit dem entsprechenden Hinweis geschlossen.

Danke.
Gast11022013 Auf diesen Beitrag antworten »

Ja, okay.

Vielleicht hilft trotzdem jemand, wo ichs doch jetzt alles gepostet habe.

Nächstes Mal halte ich mich dran.
Harper Auf diesen Beitrag antworten »

Habt ihr zu der aufgabe noch ein Programmgerüst? Wenn ja würde das den aufbau erheblich vereinfachen... Augenzwinkern
wenn nicht und du das heute noch liest wäre cool, hab heut abend eh noch etwas zeit dann würde ichs mir mal genauer anschauen...
Ich finde btw nicht das man hier eine Arraylist braucht, ein Array funktioniert hier genauso Augenzwinkern aber Arraylist is sicherlich nich falsch

//edit: dein boolean "untergekommen" in der klasse guest ist (zumindest soweit ichs beim überfliegen gesehn hab) nicht bekannt, da sollte dir aber eclipse/netbeans schon meckern geschockt
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »