Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich wollte eine Klasse Menge schreiben, die die typischen Operationen einer Menge bietet(jaja ich weiß es gibt Sets usw.^^)
Ich habe aber leider nur einen Zustandsorientieren Ansatz gefunden, spricht eine Klasse von der Typen angelegt werden können
Java:
import java.util.*;
public class Menge extends ArrayList<Integer> {
public boolean add (Integer i) { // fuegt ein neues Element hinzu
if ( i < 0 || this.contains(i) ) {
return false;
}
super.add(i);
return true;
}
public boolean pruefeElement(int i){ // Prueft ob das Element i in der Menge vorhanden ist
if(this.contains(i)){
return true;
}else
return false;
}
public void remove(Integer i){ // Entfernt das Element an position i
if(this.contains(i)){
super.remove(i);
}
}
public boolean pruefeLeer(){ // prueft ob die Menge leer ist
if(size() == 0){
return true;
} else
return false;
}
public static void main(String[] args){
Menge m1 = new Menge();
m1.add(1);
System.out.println(m1.pruefeElement(1));
}
}
Ich fand die ArrayList gut, da man schon einige Funktionalitäten einfach überschreiben kann.
Wie mache ich das ganze nun Wert-orientiert,also nur statische Methoden?
Ich kann dann nicht mehr ArrayList überschreiben, da die Methoden nicht static definiert sind logischerweise.
Er hat eine Wert Orientierte Klasse definiert als eine Klasse die nur statische methoden enthält.man kann zwar von der klasse instanzen erstellen,nur eben nicht mit ihnen arbeiten.^^
Aha...
Naja, dann kannst du ja dennoch nicht von ArrayList ableiten, sondern eine statische ArrayList als Klassen-Variable haben, auf der du genau das gleiche wie in deinem Code machst.
import java.util.*;
public class Menge {
static ArrayList l1 = new ArrayList();
public static boolean add (Integer i) { // fuegt ein neues Element hinzu
if ( i < 0 || l1.contains(i) ) {
return false;
}
l1.add(i);
return true;
}
public static boolean pruefeElement(int i){ // Prueft ob das Element i in der Menge vorhanden ist
if(l1.contains(i)){
return true;
}else
return false;
}
public static void remove(Integer i){ // Entfernt das Element an position i
if(l1.contains(i)){
l1.remove(i);
}
}
public static boolean pruefeLeer(){ // prueft ob die Menge leer ist
if(l1.size() == 0){
return true;
} else
return false;
}
public static void main(String[] args){
Menge.add(1);
}
}
Die Sichtbarkeit von der ArrayList kannst du noch ändern und die restlichen Methoden auch static machen.
Bei pruefeLeer kannst du z.B. auch folgendes schreiben:
Java:
public static boolean pruefeLeer(){
return l1.size() == 0;
}
Aber bist du dir sicher, dass du die Aufgabe nicht falsch verstanden hast? Was machst du denn, wenn du 2 Mengen haben willst?
ich weiß,irgendwie komisch. vor allem,weil er dazu schreibt,das die klasse noch funktionalitäten wie vereinigung und schnittmenge machen kann und das geht ja nun mal nur mit 2 mengen..
ich werde morgen mal nachfragen und mich dann melden.
das mir die Begriffe "Zustands- und Wertorientierte Klassen" bisher gar nicht bekannt waren, habe ich gegoogelt und herausgefunden, dass es eigentlich die sehr selten verwendete deutsche Bezeichnung für "mutable" und "immutable" ist. Ich vermute Du hast die Aufgabe nicht richtig verstanden, den eine Mengen-Klasse mit nur statischen Methoden hat in einer objektorientierten Programmiersprache keinen Sinn. Wie es richtig gemacht wird, steht hier:
also ich hab nachgefragt. eine wertorientierte klasse ist,wenn sie nach der initalisierung des objektes nichts meh ändert.die werte bleiben gleich.also eben wertorientiert.
für meine klasse menge bedeutet das,das ich nichts mehr an einer menge ändern darf,sondern eine neue erstellen muss,sobald ein element eingefügt wird.
Also immutable, wie in slawaweis' Link steht. In deiner Mengenklasse kannst du zunächst mal alle statics rausnehmen.
Dann musst du natürlich noch deine Methoden etwas anpassen, z.b.:
public int remove(Integer i){ // Entfernt das Element an position i
if(l1.contains(i)){
....
}
}
da das ganze ja immutable ist,brauch ich eine neue arrayliste,ohne den wert i.nur wie kopiere ich die jetzige und nehme den wert i raus? ich darf ja nichts an der aktuellen arraylist (l1) ändern,sondern muss eine neue erstellen.
Deine Signatur ist falsch.
Die Rückgabe wäre wieder ein Objekt der Klasse Menge.
Zu deinem Probem:
Erstelle dir eine neue ArrayList und kopiere alle nötigen werte rüber.
Auf basis dieser neuen List erstellst du dir ein neues Mengenobjekt und gibst das zurück. Das machst du analog bei allen methoden.
public Menge remove(Integer i){ // Entfernt das Element an position i
if(l1.contains(i)){
......
Menge neuesObj = new Menge();
}
}
beschränken wir uns nur mal auf die Methode remove. Also ich habe eine Klasse Menge mit einer Arraylist,die ja die eigentliche Menge darstellen soll. Jetzt möchte ich aus dieser ArrayList einen Integer Wert i entfernen. Da wir ja von immutable ausgehen -> neues Mengenobjekt mit neuer ArrayList.
Hab ich das richtig verstanden?Kannst du mir mal beim coden helfen?
Je nachdem wie scharf man immutable definiert wären die Schritte in etwa folgende:
- List klonen
- gewünschte Operation durchführen(add, remove,...)
- neues Mengen Objekt erstellen (new Menge(neueList)
- objekt zurückgeben
Für den Dritten schritt brauchst du dann noch einen Konstruktor der eine List entgegennimmt.
Die Sichtbarkeit von der ArrayList kannst du noch ändern und die restlichen Methoden auch static machen.
Bei pruefeLeer kannst du z.B. auch folgendes schreiben:
Java:
public static boolean pruefeLeer(){
return l1.size() == 0;
}
Aber bist du dir sicher, dass du die Aufgabe nicht falsch verstanden hast? Was machst du denn, wenn du 2 Mengen haben willst?
Hm vielleicht so wie Ada Objektorientiertheit versteht.
(Der Einfachheit halber nur mit einem int als Wert)
Java:
public class WerteKlasse {
int mWert = 0;
public static int getWert(WerteKlasse pWerteKlasse) {
return pWerteKlasse.mWert;
}
public static void setWert(WerteKlasse pWerteKlasse, int pWert) {
pWerteKlasse.mWert = pWert;
}
}