java Klasse

#1
Guten Tag



ich brauche ein Java Klasse für ein Auto. Da ich noch Java-Anfängerin bin, kann ich folgendes kleines Problem nicht lösen. Ich muss ein Klasse Auto in Java definieren (das kann ich schon, siehe hier),







Code:
public class Auto {
String kennzeichen;
String farbe;

double ps;
public Auto(String myKennzeichen, String myFarbe
, double myPs
) {
this.kennzeichen=myKennzeichen;
this.farbe=myFarbe;
this.ps=myPs;
}
}


aber Kennzeichen muss eindeutig sein, d.h. in einem Auto-Array dürfen keine 2 Autos vorkommen, die desselben Autokennzeichen haben



Ferner können die Autos nur Farben aus {Rot Blau Geld Weiss Schwarz} haben, wobei die Autos auch noch nach Farben sortiert werden können. Für die Farbensortierung gilt Rot<Blau<Geld<Weiss<Schwarz



kann jemand mir zeigen, wie ich mein Code so ergänzen, dass die entsprechenden Anforderungen erfüllt. Dafür wäre ich sehr dankbar



Lg Sandra
 

HonniCilest

Erfahrenes Mitglied
#3
Müssen die Farben als String definiert werden? Ansonsten würde ich für die Farben einen Enum erstellen, was nützlich wäre für die Sortierung und für die Farb-Range.

Ansonsten lese ich 3 Anforderungen heraus:
1) Im Array kein Kennzeichen doppelt zulassen
2) Nur bestimmte Farben zulassen
3) Farben sortieren können

zu 1) Entweder du überprüfst beim Einfügen in das Array, ob das Kennzeichen bereits vorhanden ist oder du überschreibst die equals-Methode von Auto, dann kannst du 'bestehende' Funktionen nutzen, welche auf Duplikate prüfen.
zu 2) Wie oben erwähnt würde ich für die Farben ein Enum verwenden, vorausgesetzt du darfst das. Auch wegen 3)
zu 3) Ich gehe hier davon aus, dass die Farben in einem Enum stehen. Hier sei ein Beispiel:

Java:
import java.util.Arrays;

public class Kind implements Comparable<Kind> {
public enum Geschlecht {
MAEDCHEN, JUNGE;

@Override
public String toString() {
switch(this) {
case MAEDCHEN:
return "Mädchen";
case JUNGE:
return "Junge";
Default:
return "";
}
}
}

private Geschlecht geschlecht;
private String name;

public Kind(String name, Geschlecht geschlecht) {
this.name = name;
this.geschlecht = geschlecht;
}

@Override
public int compareTo(Kind kind) {
if(geschlecht.ordinal() < kind.geschlecht.ordinal()) return -1;
else if(geschlecht.ordinal() > kind.geschlecht.ordinal()) return 1;
else return 0;
}

@Override
public String toString() {
return name + ", " + geschlecht;
}

public static void main(String[] args) {
Kind[] kinder = {new Kind("A", Geschlecht.JUNGE), new Kind("B", Geschlecht.MAEDCHEN), new Kind("C", Geschlecht.MAEDCHEN), new Kind("D", Geschlecht.JUNGE)};
System.out.println(Arrays.toString(kinder));

Arrays.sort(kinder);
System.out.println(Arrays.toString(kinder));
}
}
Ausgabe:
[A:Junge, B:Mädchen, C:Mädchen, D:Junge]

[B:Mädchen, C:Mädchen, A:Junge, D:Junge]
 
#4
zu 1) Entweder du überprüfst beim Einfügen in das Array, ob das Kennzeichen bereits vorhanden ist oder du überschreibst die equals-Methode von Auto, dann kannst du 'bestehende' Funktionen nutzen, welche auf Duplikate prüfen.
> bitte konkreter sein
zu 2) Wie oben erwähnt würde ich für die Farben ein Enum verwenden, vorausgesetzt du darfst das. Auch wegen 3)
> habe hin bekommen
 

HonniCilest

Erfahrenes Mitglied
#5
Nun um "genauer" zu sein, müsste ich wissen wie dein Array befüllt wird. Ist es überhaupt ein Array oder kannst du auch andere Listentypen nehmen wie z.B. ArrayList?
Musst du beim Einfügen in der Liste sicherstellen, dass das Kennzeichen noch nicht vorhanden ist oder musst du aus einer bestehenden Liste Duplikate finden und entfernen?
 
#7
#8
mei code ist





Code:
import java.util.*;

public class AutoTest {
static Auto [] arrayAuto = new Auto [] {
new Auto("N-DTJ-123", "ROT", 123), 
new Auto("N-DTJ-123", "BLAU", 123), 
};

public static void main(String[] args) {




for(int i=0; i<arrayAuto.length; i++)
{
System.out.printf(Locale.ENGLISH, "%d --> %s\n", 
i, 
arrayAuto[i].kennzeichen
);

}



}
}
 

Halfbax

Erfahrenes Mitglied
#9
@g.sandra.1995 Als kleinen Tipp: Bitte das Einrücken nicht vergessen! Das sollte stark helfen.

Nun zu deinem Anliegen. Du müsstest vorher eine Prüfung starken, ob dieses Kennzeichen bereits vorher vorhanden ist, da mit jedem Auto eine neue Objektinstanz gestartet wird. Anfängertechnisch sollte das die einfachste Lösung sein. Ich möchte dir hiermit eine Starhilfe geben im Bezug auf das Einrücken sowie deinem Anliegen

Java:
    private static boolean createAuto(ArrayList<Auto> autoCollection, Auto neuesAuto) {
       boolean isCreateable = true;
       
       for (Auto auto : autoCollection)
           if(auto.getKennzeichen() == neuesAuto.getKennzeichen()) {
               isCreateable = false;
               break;
           }
       
       return isCreateable;
   }
Wenn du dir etwas mehr Arbeit machen möchtest dann bau dir eine Helper Klasse, die alle Auto beinhaltet und dementsprechend throw einen Error/eine Rückmeldung bei einer Erstellung eines bereits vorhanden Kennzeichen.

Mit freundlichen Grüßen
Halfbax
 

HonniCilest

Erfahrenes Mitglied
#10
Ganz ehrlich, wenn Sandra etwas anderes als Arrays nehmen kann/darf/will dann würde ich keine solche Methode wie "createAuto" selbst implementieren. Als Listen-Typ dann einfach HashSet (dafür equals/hasCode überschreiben)
https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html#add(E)

Und schon überprüft die add-Methode von selbst, ob das Element bereits vorhanden ist.

In Auto:
Java:
    @Override
    public String toString() {
        return kennzeichen + ":" + farbe;
    }

    @Override
    public boolean equals(Object o) {
        if(!(o instanceof Auto)) return false;
      
        Auto auto = (Auto)o;
      
        return kennzeichen.equals(auto.kennzeichen);
    }
  
    @Override
    public int hashCode() {
        return kennzeichen.hashCode();
    }
HashSet:
Java:
HashSet<Auto> autos = new HashSet<Auto>();
        autos.add(new Auto("A", Farbe.WEISS));
        autos.add(new Auto("A", Farbe.SCHWARZ));
        autos.add(new Auto("B", Farbe.ROT));
      
        System.out.println(autos);
Ausgabe
Code:
[A:weiß, B:rot]
 
Zuletzt bearbeitet:

HonniCilest

Erfahrenes Mitglied
#12
Ausgabe bei mir nur [Auto@41, Auto@42]
Du musst deinem Objekt Auto schon beibringen, wie es auf der Console ausgegeben werden soll, indem du die Methode toString() überschreibst.
(was ich in meinen Beispielen auch mit aufgeführt hatte)
 
Zuletzt bearbeitet:
#13

HonniCilest

Erfahrenes Mitglied
#15
Moin,

schon, nur dass Du es dann auch nicht benutzt hast :D

Gruß Klaus
Doch klar habe ich sie benutzt. Natürlich habe ich sie nicht implizit aufgerufen, aber "autos" war in diesem Fall eine HashSet und die Ausgabe hier erfolgt wie in meiner aufgezeigten Ausgabe. HashSet.toString() ist bereits sinnvoll implemtiert, jedoch nicht von einem Array. Bei Arrays ist Arrays.toString(array) notwendig.
 
#16
Guten Tag



Vielen für Ihre Hilfe.



Ich fasse nun zusammen



die enum Klasse ist



Code:
enum Farbe {



ROT,

BLAU,

GELB,

WEISS,

GRAU,

SCHWARZ;



}


die Auto Klasse ist



Code:
import java.util.*;



public class Auto implements Comparable<Auto> {

String kennzeichen;

Farbe farbe;

double ps;



public Auto(String myKennzeichen, Farbe myFarbe, double myPs) {

this.kennzeichen = myKennzeichen;

this.farbe = myFarbe;

this.ps = myPs;

}



public String getKennzeichen() {

return kennzeichen;

}



public Farbe getFarbe() {

return farbe;

}



public double getPs() {

return ps;

}



private static boolean createAuto(ArrayList<Auto> autoCollection, Auto neuesAuto) {

boolean isCreateable = true;

for (Auto auto : autoCollection)

if (auto.getKennzeichen() == neuesAuto.getKennzeichen()) {

isCreateable = false;

break;

}

return isCreateable;

}



@Override

public String toString() {

String erg="";

erg = erg + String.format(Locale.ENGLISH, "%s Farbe=%s mit %1.3f PS\n",

kennzeichen, farbe, ps);

erg = erg + String.format(Locale.ENGLISH, "\n");

return erg;

}



@Override

public boolean equals(Object o) {

if (!(o instanceof Auto))

return false;

Auto auto = (Auto) o;

return kennzeichen.equals(auto.kennzeichen);

}



@Override

public int hashCode() {

return kennzeichen.hashCode();

}



@Override

public int compareTo(Auto ot) {

if (farbe.ordinal() < ot.farbe.ordinal())

return -1;

else if (farbe.ordinal() > ot.farbe.ordinal())

return 1;

else

return 0;

}

}


… alles testen



Code:
import java.util.*;



public class AutoTest {



public static void main(String[] args) {

HashSet<Auto> autos = new HashSet<Auto>();

autos.add(new Auto("A", Farbe.WEISS, 28));

autos.add(new Auto("A", Farbe.SCHWARZ, 37));

autos.add(new Auto("B", Farbe.ROT, 59));

autos.add(new Auto("C", Farbe.BLAU, 28));

autos.add(new Auto("D", Farbe.GRAU, 37));

autos.add(new Auto("E", Farbe.GRAU, 59));

System.out.println(autos);

System.out.println("+++++sortiert+++++");

List sortedList = new ArrayList(autos);

Collections.sort(sortedList);

System.out.println(sortedList);

}

}


bei Compilieren bekomme ich die Meldung




Note: AutoTest.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.



hat jemand Verbesserungen?
 
#17

Bratkartoffel

gebratene Kartoffel
Premium-User
#18
Hi,

1) Die Warning kommt bei deinem Test, Zeile 29. Hier fehlen die Generics auf der Liste:
Java:
List sortedList = new ArrayList(autos);
2) Deine Auto.toString() ruft die format() 2x auf, dies kann man auf einen Aufruf zusammenfassen
3) Die Auto.hashCode() und equals() sind nicht null-safe (Exception wenn kennzeichen = null)
4) Attribute sind normalerweise private. Da du keine Setter hast, kannst du diese bei dir auch final machen.
5) Die Auto.createAuto() kann man als Einzeiler schreiben:
Java:
return autoCollection.stream().noneMatch(neuesAuto::equals);
6) Deine Auto.compareTo() kann man auch als Einzeiler schreiben:
Java:
return farbe.ordinal() - ot.farbe.ordinal();
Grüsse,
BK