Collections{Liste aus Objekten erzeugen]

Status
Nicht offen für weitere Antworten.

mamelinchen

Bekanntes Mitglied
Es geht darum,eine abstrakte Klasse namens AbstractPerson zu schreiben
mit Vornamen,Nachnamen,usw.

Die Klassen Persdon und Comparable Person erben von dioeser Klasse und enthalten eine public boolean equals Methode, die überprüft, ob das Objekt null ist, und ob die Instanzvariablen gleichwertig sind.

Ich habe alle Instanzvariablen als Strings deklariert, dazu die Postleitzahl, da sie ja führende Nullen haben kann und als int würden sie verschwinden.Ebenso beim Geburtsjahr, da dieses ja auch als 79 ,anstattt 1979 angegeben werden kann.

ComparablePerson implementiert ebenso java.lang.Comparable<ComparablePerson>
Dies soll die CP-Objekte anhand des Nachnamens, Vornamens,usw. vergleichen.

Die mach ich durch die String.compareTo-Methode ,die von equals aufgerufen wird.

Mein Problem besteht in der Aufgabe:
Textdatei ,in der die Vornamen,nachnamen ....stehen,ungeordnet.10 Zeilen.
In der Klasse Names sollen die Methoden public static List getTestNames() und public static List getTestNamesComparable(), die jeweils die txt einlesen ,für jede Zeile
ein Objekt erzeugen und alle Objekte in einer Liste zurückgeben.

Meine Frage:
Umwandlung in ein String-Objekt oder Person oder ComparablePerson.Objekt?
Ich lese ja die Strings mit ner while-Schleife ein mit readLine().
Logischer ist ja das jeweils eine Zeile eine Person ergibt.
Soll ich die 4 "Wörter" einlesen und dann in ein Person-Objekt umwandeln und dieses dann der Liste hinzufügen?

Ich verstehe den Unterschied der beiden Methoden (wenn als String eingelesen wird)
nicht:(


Und was ist dann der Unterschied zu der Comparable-Methode?

Ich zeig mal was ich da so fabriziert habe:

Code:
public class ComparablePerson extends AbstractPerson implements Comparable<ComparablePerson>{

    public ComparablePerson(String vorname, String nachname, String geburtsjahr,
            String postleitzahl) {
        super(vorname, nachname, geburtsjahr, postleitzahl);
    }

    public ComparablePerson(ComparablePerson person){
        this(person.vorname,person.nachname,person.geburtsjahr,person.postleitzahl);
    }
    
    public boolean equals(Object o){
        if(!(o instanceof ComparablePerson)){
            return false;
        }
        
        ComparablePerson other=(ComparablePerson)o;
            return 0!=compareTo(other);
            
    }
    
    public int compareTo(ComparablePerson person) {
        if(0!= this.nachname.compareTo(person.nachname)){
            
        if(0!= this.vorname.compareTo(person.vorname)){
            
        if(0!= this.geburtsjahr.compareTo(person.geburtsjahr)){
            
        if(0!= this.postleitzahl.compareTo(person.postleitzahl)){
        }
        }
        }
        }
            return 0;
    }
    
}
und die Names:
Code:
public class Names {
    
    
    public static void main (String arg[])throws IOException {
        Locale.setDefault(Locale.US);
        System.out.println(getTestNames());
        System.out.println(getTestNamesComparable());
        
    }
    
    public static List getTestNames() throws IOException{
        LineNumberReader read=new LineNumberReader(
                  new BufferedReader(
                      new FileReader(
                          new File( "../pr2/src/a01/testNamen.txt" )
                      )
                  )
               );
        
        String[]lines=new String[10];
        ArrayList<String> namesList = new ArrayList<String>();
        for(int i=0; i<lines.length;i++){
            lines[i]=read.readLine();
            namesList.add(lines[i]);
        }
            return namesList;
    }
    
    public static List getTestNamesComparable() throws IOException{
        LineNumberReader read=new LineNumberReader(
                  new BufferedReader(
                      new FileReader(
                          new File( "../pr2/src/a01/testNamen.txt" )
                      )
                  )
               );
        String[]lines2=new String[10];
        ArrayList<String> namesComparableList = new ArrayList<String>();
        for(int i=0; i<lines2.length;i++){
            lines2[i]=read.readLine();
            namesComparableList.add(lines2[i]);
        }
        return namesComparableList;
        
    }

}
Lese hier nur die Strings je Zeile ein und füge diese der Array-List hinzu.
Eine normale List kann man nicht erzeugen, bekomme ne Exception.
Kann mir einer sagen warum?

Is alles okay soweit????:L
 

GilbertGrape

Bekanntes Mitglied
Lese hier nur die Strings je Zeile ein und füge diese der Array-List hinzu.
Eine normale List kann man nicht erzeugen, bekomme ne Exception.
Kann mir einer sagen warum?

Hi,

was ist eine normale List? Von List selbst kannst du keine Isntanz erzeugen, weil es ein Interface ist.
Du könntest höchstens schreiben:
[highlight=Java]List<String> namesComparableList = new ArrayList<String>();[/highlight]
 

SchonWiederFred

Bekanntes Mitglied
Code:
public int compareTo(ComparablePerson person) {
        if(0!= this.nachname.compareTo(person.nachname)){
            
        if(0!= this.vorname.compareTo(person.vorname)){
            
        if(0!= this.geburtsjahr.compareTo(person.geburtsjahr)){
            
        if(0!= this.postleitzahl.compareTo(person.postleitzahl)){
        }
        }
        }
        }
            return 0;
}
Hier wird IMMER 0 zurückgegeben -- sehr merkwürdige Implementation.
 

mamelinchen

Bekanntes Mitglied
Code:
public int compareTo(ComparablePerson person) {
        int zahl=0;
        if(zahl== this.nachname.compareTo(person.nachname)){
            
        if(zahl== this.vorname.compareTo(person.vorname)){
            
        if(zahl== this.geburtsjahr.compareTo(person.geburtsjahr)){
            
        if(zahl== this.postleitzahl.compareTo(person.postleitzahl)){
            return zahl;
        }
        }    
        }
        }
        return 1;
bezza?
 

Leroy42

Top Contributor
Code:
public int compareTo(ComparablePerson person) {
        int zahl=0;
        if(zahl== this.nachname.compareTo(person.nachname)){
            
        if(zahl== this.vorname.compareTo(person.vorname)){
            
        if(zahl== this.geburtsjahr.compareTo(person.geburtsjahr)){
            
        if(zahl== this.postleitzahl.compareTo(person.postleitzahl)){
            return zahl;
        }
        }    
        }
        }
        return 1;
bezza?

Bist du dir sicher, daß dieser Code irgend etwas vernünftiges zurückliefert? :shock:
 

Civilazi

Bekanntes Mitglied
Wo wird denn da -1 zurückgegeben? Guck dir in der Api nochmal Comparable --> compareTo(T) an.

So ist das nur sowas ähnliches wie equals.
 

mamelinchen

Bekanntes Mitglied
Gesagt wurde, man solle sich die API angucken mit compareTo, aber boolean equals verwenden?
Ich weiss das -1 gegeben wird , wenn less, 0 wenn equal und 1 wenn higher.
Es soll ja nur bei equals zurückgegeben werden:false oder true.
Was hab ich dann von einer 1 oder -1?Ist doch dann eh false, oder nicht?


Danke!

PS:Und seid net so geschockt:shock:,
programmier erst seit 4 monaten:autsch:
 

KSG9|sebastian

Top Contributor
compareTo bietet mehr Funktionen als equals. Wenn du nur equals zurückliefern sollst dann mach
Code:
public int compareTo(ComparablePerson cp){
   return equals(cp) ? 0 : 1;
}
 

Civilazi

Bekanntes Mitglied
Gesagt wurde, man solle sich die API angucken mit compareTo, aber boolean equals verwenden?
Ich weiss das -1 gegeben wird , wenn less, 0 wenn equal und 1 wenn higher.
Es soll ja nur bei equals zurückgegeben werden:false oder true.
Was hab ich dann von einer 1 oder -1?Ist doch dann eh false, oder nicht?

Hä?

Ich meinte, dass dein compareTo nur sowas ähnliches wie equals leistet. Aber ein compareTo soll, wie über mir gesagt, mehr können. Das scheinst du ja zu wissen, also warum implementierst du das nicht so?
 

Marco13

Top Contributor
compareTo bietet mehr Funktionen als equals. Wenn du nur equals zurückliefern sollst dann mach
Code:
public int compareTo(ComparablePerson cp){
   return equals(cp) ? 0 : 1;
}

Damit werden eine ganze Reihe von Regeln verletzt - im spziellen die, die in Comparable (Java Platform SE 6) zugesichert sind. D.h. wenn man das ganze dann in eine Set einfügt, kommt eine ungültige Set raus...
 

Marco13

Top Contributor
Ja, sicher, da fehlte ein "Tree" - aber auch in anderen Fällen kann das ... "unerklärliche" Effekte haben... die Aussage "a>b && b>a" sollte i.a. "false" sein...
 

mamelinchen

Bekanntes Mitglied
okay!liefert genau das was halt compareTo können sollte:

Code:
    public int compareTo(ComparablePerson person) {
        int zahl=0;
        if(zahl!= this.nachname.compareTo(person.nachname)){
            return zahl=this.nachname.compareTo(person.nachname);
        }    
        else if(zahl!= this.vorname.compareTo(person.vorname)){
            return zahl= this.vorname.compareTo(person.vorname);
        }
        else if(zahl!= this.geburtsjahr.compareTo(person.geburtsjahr)){
            return zahl= this.geburtsjahr.compareTo(person.geburtsjahr);
        }    
        else if(zahl!= this.postleitzahl.compareTo(person.postleitzahl)){
            return zahl= this.postleitzahl.compareTo(person.postleitzahl);
        }
        else return zahl;
        
    }
 

Marco13

Top Contributor
Code:
public int compareTo(ComparablePerson person) 
{
        int zahl=0;
        zahl=this.nachname.compareTo(person.nachname);
        if (zahl != 0) return zahl;
        zahl = this.vorname.compareTo(person.vorname);
        if (zahl != 0) return zahl;
        zahl= this.geburtsjahr.compareTo(person.geburtsjahr);
        if (zahl != 0) return zahl;
        zahl= this.postleitzahl.compareTo(person.postleitzahl);
        return zahl;
}
 
S

Spacerat

Gast
Kann man meinen oberen Quellcode vereinfachen?
Jup... z.B. so[highlight= java]public int compareTo(ComparablePerson person) {
int zahl;
if((zahl = this.nachname.compareTo(person.nachname)) != 0) {
return zahl;
}
if((zahl = this.vorname.compareTo(person.vorname)) != 0) {
return zahl;
}
if((zahl = this.geburtsjahr.compareTo(person.geburtsjahr)) != 0) {
return zahl;
}
if((zahl = this.postleitzahl.compareTo(person.postleitzahl)) != 0) {
return zahl;
}
return 0;
}[/highlight]Der Vorteil: die einzelnen "compareTo"-Methoden werden nur einmal aufgerufen und zwar nur solange "zahl == 0" ist. Möglicherweise gehts auch noch einfacher, aber ich sicher nicht gleichzeitig übersichtlicher.
@Edit: da war jemand schneller... Was soll's das Ergebnis ist fas selbe.
 
Zuletzt bearbeitet von einem Moderator:

KSG9|sebastian

Top Contributor
Damit werden eine ganze Reihe von Regeln verletzt - im spziellen die, die in Comparable (Java Platform SE 6) zugesichert sind. D.h. wenn man das ganze dann in eine Set einfügt, kommt eine ungültige Set raus...

Richtig!
Aber er hat ja gesagt dass er im Endeffekt _nur_ ein equals erreichen will.

Ich hab ja nirgends geschrieben dass die Implementierung so korrekt oder empfehlenswert ist.
Ich würde es so definitiv nicht machen :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Sortierung in collections testen Java Basics - Anfänger-Themen 11
X Collections.sort als Lambda Java Basics - Anfänger-Themen 14
berserkerdq2 Geht collections.sort bei allen? Linkedhashset, ArrayList, HashSet etc. Java Basics - Anfänger-Themen 4
O Collections.sort und List.sort mit Lambda Verwirrung Java Basics - Anfänger-Themen 5
B Collections.sort mit zwei Bedingungen? Java Basics - Anfänger-Themen 4
I Collections.shuffle funktioniert nicht Java Basics - Anfänger-Themen 1
M Collections Frage Java Basics - Anfänger-Themen 1
D Methoden Collections.shuffle mit bestimmtem Startwert? Java Basics - Anfänger-Themen 8
T Java Collections Java Basics - Anfänger-Themen 58
X Collections Collections Maps Frage Java Basics - Anfänger-Themen 4
C Collections: private Map Java Basics - Anfänger-Themen 4
V Collections Java Basics - Anfänger-Themen 3
A Collections Java Basics - Anfänger-Themen 2
P collections.sort Java Basics - Anfänger-Themen 2
R Iterationsreihenfolge über Collections Java Basics - Anfänger-Themen 4
S Klassen Collections Java Basics - Anfänger-Themen 10
J Polymorphie Iteratoren statt Collections Java Basics - Anfänger-Themen 13
H Etwas wie sort() / sorted() in JAVA-Collections? Java Basics - Anfänger-Themen 5
F Collections ArrayList oder Hashmap mittel Collections.sychronised Java Basics - Anfänger-Themen 6
S Bestimmte Objekte aus Collections anwählen/herausbekommen Java Basics - Anfänger-Themen 8
M Collections mit >2 type Parametern? Java Basics - Anfänger-Themen 8
S Frage zu Collections.frequency() Java Basics - Anfänger-Themen 3
T Collections Übersicht Collections Java Basics - Anfänger-Themen 4
X Collections Inhalt von zwei Collections prüfen Java Basics - Anfänger-Themen 4
A Generische Collections und Vererbung Java Basics - Anfänger-Themen 2
K Telefonbuch Implementation mit Java Collections Java Basics - Anfänger-Themen 4
G Collections.binarySearch(LinkedList): cannot find method Java Basics - Anfänger-Themen 6
S Collections Sortieren von 3 Collections nach "einer Sortierung" Java Basics - Anfänger-Themen 3
T Kleine Frage zu Collections Java Basics - Anfänger-Themen 3
A Collections und ArrayList Java Basics - Anfänger-Themen 2
S Klasse Mit Collections Java Basics - Anfänger-Themen 32
X DB4O Collections and Arrays, brauche dringend Hilfe! Java Basics - Anfänger-Themen 3
D Datentypen Generische Collections und Warnings Java Basics - Anfänger-Themen 8
K Aufgabe Collections Java Basics - Anfänger-Themen 2
D Collections - subList erstellen Java Basics - Anfänger-Themen 4
S Frage zu Enumerator der trad.Collections Java Basics - Anfänger-Themen 8
M Instanzen, Referenzen und Collections Java Basics - Anfänger-Themen 3
Dit_ Collections.sort(..); | Anwendung Java Basics - Anfänger-Themen 4
T array erweitern/flexible ohne collections usw. Java Basics - Anfänger-Themen 3
S Collections Java Basics - Anfänger-Themen 13
S generics und Collections#unmodifiableList Java Basics - Anfänger-Themen 2
G Wann Arrays, wann Collections? Java Basics - Anfänger-Themen 36
N Collections Sort ArrayList<> Java Basics - Anfänger-Themen 7
N Suche Infos zu Maps - Collections Java Basics - Anfänger-Themen 4
G erstes Arbeiten mit Collections Java Basics - Anfänger-Themen 17
Zed Collections? ArrayList, Vector. Java Basics - Anfänger-Themen 2
M Collections kopieren (ArrayList<Point>) Java Basics - Anfänger-Themen 3
T Fragen zu Collections Java Basics - Anfänger-Themen 2
J Collections "schachteln" Java Basics - Anfänger-Themen 5
ff Java Collections Java Basics - Anfänger-Themen 4
H Collections Frameworks Java Basics - Anfänger-Themen 38
T Object Collections durchsuchen und nutzen Java Basics - Anfänger-Themen 6
S Mit Collections elemente sammeln Java Basics - Anfänger-Themen 7
D Collections.sort() frage Java Basics - Anfänger-Themen 6
G Java Collections Framework : id + 5 Werte , gibt es sowas Java Basics - Anfänger-Themen 4
frau-u Collections und Interfaces Java Basics - Anfänger-Themen 2
R Liste in Variable speichern Java Basics - Anfänger-Themen 6
R Liste und Arrays Java Basics - Anfänger-Themen 12
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
M Verkettete Liste Java Basics - Anfänger-Themen 1
M Vergleichen, ob eine Liste länger als andere ist Java Basics - Anfänger-Themen 6
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
D remove Object von einer Liste von Obejcts Java Basics - Anfänger-Themen 3
E Elemente aus Liste entfernen und hinzufügen Java Basics - Anfänger-Themen 3
M Nullpointer beim befüllen meiner Liste im Object Java Basics - Anfänger-Themen 3
D Länge einer Liste aufrufen. Java Basics - Anfänger-Themen 19
B Objekt aus generalisierter Liste entfernen Java Basics - Anfänger-Themen 11
H Liste Knoten NullPointerException Java Basics - Anfänger-Themen 7
W Liste mit Listen in JTable darstellen Java Basics - Anfänger-Themen 1
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
E Suchfunktion in einer Liste Java Basics - Anfänger-Themen 39
T ungeordnete Werte-Paare in einer Liste Java Basics - Anfänger-Themen 7
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
berserkerdq2 Warum soll ich shuffle nutzen, um bei Rückgabewert Collection eine Liste zurückzugeben? Java Basics - Anfänger-Themen 3
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
f3mys Objektwerte in Liste speichern und wieder abrufen Java Basics - Anfänger-Themen 23
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
K Warum ist die binäre Suche bei der verketteten Liste nicht so effektiv? Java Basics - Anfänger-Themen 3
I 2D-Array Position der Liste ausgeben. Java Basics - Anfänger-Themen 2
I Liste von Infos von einer eigenen Annotation in Liste speichern Java Basics - Anfänger-Themen 0
P Doppelte werte in einer Liste zählen Java Basics - Anfänger-Themen 11
Dorfschmied Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen Java Basics - Anfänger-Themen 4
Igig1 Autoparkplatz verkettete Liste erstes und letztes Auto Java Basics - Anfänger-Themen 13
thor_norsk Verkette Liste Java Basics - Anfänger-Themen 27
R Rückgabe: verkettete Liste Java Basics - Anfänger-Themen 2
R einfach verkettete Liste Java Basics - Anfänger-Themen 1
R einfach verkettete Liste Java Basics - Anfänger-Themen 12
O Doppelt verkette Liste Element löschen Java Basics - Anfänger-Themen 15
B GUI extension mit einer Liste verbinden Java Basics - Anfänger-Themen 1
B Verkettete Liste durchgehen und einzelne Elemente in neue Liste tun Java Basics - Anfänger-Themen 9
B Bin komplett am verzweifeln :( Verkettete Liste die Objekte hat Attribut auslesen Java Basics - Anfänger-Themen 14
M Java Liste streamen Java Basics - Anfänger-Themen 10
AmsananKING Aussortierung einer Liste Java Basics - Anfänger-Themen 8
A Objekte mit Parametern in eine Liste packen Java Basics - Anfänger-Themen 19
A Korrigierte <String> Liste zurückgeben Java Basics - Anfänger-Themen 22
S Kann nicht auf die Liste zugreifen mit der Methode!? Java Basics - Anfänger-Themen 3
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben