Klassen problem

flashdog

Bekanntes Mitglied
Hallo
Ich habe folgenden Code geschrieben:

Java:
import java.util.ArrayList;
import java.util.Date;

class Nachricht {
  public Date uhrzeit;
  public String nachricht;
};

class NachrichtService {
  Nachricht nachricht = new Nachricht();

  public void addNachricht(String msg) {
    nachricht.nachricht = msg;
    Date now = new Date();
    nachricht.uhrzeit = now.getTime();
  }

  public Nachricht getNaechsteNachricht() {
    return nachricht;
  }
};

public class NachrichtenTest {

  public static void main(String[] args) {
    NachrichtService nachricht = new NachrichtService();
    ArrayList<NachrichtService> nachrichten = new ArrayList<NachrichtService>();
    nachrichten.add(nachricht.addNachricht("Hallo"));
  }
}

Leider bekomme ich diese Fehlermeldungen:
Code:
NachrichtenTest.java:15: incompatible types
found   : long
required: java.util.Date
    nachricht.uhrzeit = now.getTime();
NachrichtenTest.java:28: 'void' type not allowed here
    nachrichten.add(nachricht.addNachricht("Hallo"));
2 errors

Wie kann man diesen Code zum laufen bringen?

Viele Grüße
 
S

SlaterB

Gast
andersrum gefragt: was soll der Code deiner Meinung nach leisten?
was hattest du dir dabei gedacht, als du
> nachrichten.add(nachricht.addNachricht("Hallo"));
schriebst?
was soll da in die Liste rein, die Nachricht? (= das NachrichtService-Objekt oder ein anders?)

wieso kombinierst du das Einfügen in die Liste mit dem separaten Methodenaufruf addNachricht(),
oder besteht da eine Verbindung?
 

flashdog

Bekanntes Mitglied
Mit addNachricht Methode würde ich ganz gerne eine Nachricht und die aktuelle Uhrzeit speichern. z.B. N1.

Wenn ich die getNaechsteNachricht() Methode aufrufe würde ich gerne die erste Nachricht erhalten, z.B. 9:30, N1. Wenn ich diese Methode nochmal aufrufe würde ich ganz gerne die zweite Nachricht erhalten, z.B. 9.35, N2 usw..

Ich bin nicht wie ich alle Nachrichten mit addNachricht() abspeichern kann und in welche Datenstruktur, so dass ich sie später mit getNaechsteNachricht() Methode diese abrufen kann und ob ich richtig die beiden Klassen (Nachricht und NachrichtService) miteinander verbunden habe.
 
S

SlaterB

Gast
hmm, leider gehts du kaum auf meine Frage ein, den Codeteil nachrichten.add() ignorierst du völlig,

also ohne lehrende Hinweise:
Java:
ArrayList<NachrichtService> nachrichten = new ArrayList<NachrichtService>();
NachrichtService nservice = new NachrichtService();
nservice.addNachricht("Hallo");
Nachricht n = nservice.getNaechsteNachricht();
nachrichten.add(n);

-------

oder
Java:
Nachricht n = nservice.addNachricht("Hallo");
nachrichten.add(n);
bzw. in deinem Code
Java:
nachrichten.add(nservice.addNachricht("Hallo"));
wenn nur addNachricht() den richtigen Rückgabetyp hätte und die neue Nachricht auch zurückgibt statt void
 

flashdog

Bekanntes Mitglied
Sorry, jetzt verstehe ich was du meinst und habe versucht deine Tipps umzusetzen:
Java:
import java.util.ArrayList;
import java.util.Date;

class Nachricht {
  public Date uhrzeit;
  public String nachricht;
};

class NachrichtService {
  Nachricht nachricht = new Nachricht();
  ArrayList nachrichten = new ArrayList();
  int neachstePos = 0;

  public void addNachricht(String msg) {
    nachricht.nachricht = msg;
    Date now = new Date();
    nachricht.uhrzeit = now.getTime();
    nachrichten.add(nachricht);
  }

  public Nachricht getNaechsteNachricht() {
    int pos = neachstePos;
    neachstePos++;
    return nachrichten.get(pos);
  }
};

public class NachrichtenTest {

  public static void main(String[] args) {
    NachrichtService nservice = new NachrichtService();
    nservice.addNachricht("Hallo");
    
    Nachricht n = nservice.getNaechsteNachricht();
    System.out.println(n.nachricht + " " + n.uhrzeit);
  }
}

Leider bekomme ich folgende Fehler:
Code:
NachrichtenTest.java:18: incompatible types
found   : long
required: java.util.Date
    nachricht.uhrzeit = now.getTime();
NachrichtenTest:25: incompatible types
found   : java.lang.Object
required: Nachricht
    return nachrichten.get(pos);
NachrichtenTest.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
2 errors

Was mache ich falsch?
 
S

SlaterB

Gast
die Liste nachrichten in den Service zu verschieben ist zwar nicht genau was ich meinte,
macht aber Sinn, ja, so ist es wohl besser, soll der Service die Liste vorhalten als irgendwo in der main-Methode eine freie Liste

--------

now ist ein Date, now.getTime() ist ein long-Wert,
nachricht.uhrzeit ist vom Typ Date

nun überlege, ob du da besser now speicherst oder now.getTime()
 

flashdog

Bekanntes Mitglied
Habe den Code weiter verbessert:

Java:
import java.util.ArrayList;
import java.util.Date;

class Nachricht {
  public Date uhrzeit;
  public String nachricht;
};

class NachrichtService {
  ArrayList nachrichten = new ArrayList();
  int neachstePos = 0;

  public void addNachricht(String msg) {
    Nachricht nachricht = new Nachricht();
    nachricht.nachricht = msg;
    nachricht.uhrzeit = new Date();
    nachrichten.add(nachricht);
  }

  public Nachricht getNaechsteNachricht() {
    int pos = neachstePos;
    neachstePos++;
    return nachrichten.get(pos);
  }
};

public class NachrichtenTest {

  public static void main(String[] args) {
    NachrichtService nservice = new NachrichtService();
    nservice.addNachricht("Hallo");
    
    Nachricht n = nservice.getNaechsteNachricht();
    System.out.println(n.nachricht + " " + n.uhrzeit.getHours() + ":" + n.uhrzeit.getMinutes());
  }
}

aber leider habe bekommen ich den letzten Fehler noch nicht weg:
Code:
NachrichtenTest.java:24: incompatible types
found   : java.lang.Object
required: Nachricht
    return nachrichten.get(pos);
Note: NachrichtenTest.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: NachrichtenTest.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error

Wie bekommt den letzten Fehler weg?
 

nrg

Top Contributor
du hast deine ArrayList nicht generisch deklariert.
entweder den get zu Nachricht casten

return (Nachricht)nachrichten.get(pos);

oder besser:
Arraylist generisch deklarieren:
ArrayList<Nachricht> nachrichten = new ArrayList<Nachricht>();

grüße
nrg
 

Murray

Top Contributor
Entweder casten, oder gleich mit Generics arbeiten:

Java:
List<Nachricht> nachrichten = new ArrayList<Nachricht>();
 
S

SlaterB

Gast
eine ArrayList liefert Object und nicht Nachricht, wenn nicht generisch?
die angemerkten deprecated-Methoden sind übrigens uhrzeit.getHours() und ähnliche
 

flashdog

Bekanntes Mitglied
Ich wollte nun noch zu jeder Nachricht eine Priorität setzen (1 = Hoch; 2 = Mittel; 3 = Niedrig), und wenn ich getNaechsteNachricht aufrufe mehrmals aufrufe wollte ich z.B. diese Ausgabe erhalten:
Code:
	1,	"N 4", 9:42,
	2,	"N 2", 9:35
	3,	"N 1", 9:30
	3,	"N 3", 9:39

Den Code habe ich schon ein wenig modifiziert:
Java:
import java.util.ArrayList;
import java.util.Date;

class Nachricht {
  public Date uhrzeit;
  public String nachricht;
  public int prioritaet;
};

class NachrichtService {
  ArrayList<Nachricht> nachrichten = new ArrayList<Nachricht>();
  int neachstePos = 0;

  public void addNachricht(int prioritaet, String msg) {
    Nachricht nachricht = new Nachricht();
    nachricht.nachricht = msg;
    nachricht.uhrzeit = new Date();
    nachricht.prioritaet = prioritaet;
    nachrichten.add(nachricht);
  }

  public Nachricht getNaechsteNachricht() {
    int pos = neachstePos;
    neachstePos++;
    return nachrichten.get(pos);
  }
};

public class NachrichtenTest {

  public static void main(String[] args) {
    NachrichtService nservice = new NachrichtService();
    nservice.addNachricht(3,	"N 1");
    nservice.addNachricht(2,	"N 2");
    nservice.addNachricht(3,	"N 3");
    nservice.addNachricht(1,	"N 4");

    Nachricht n = nservice.getNaechsteNachricht();
    System.out.println(n.prioritaet + " "+ n.nachricht + ", " + n.uhrzeit.getHours() + ":" + n.uhrzeit.getMinutes());
  }
}

Leider weiss ich nicht wie man am beste die Nachrichten speichern könnte, da ArrayList keine sortier Möglichkeit bietet. Vielleicht gibt es etwas besseres?
 

flashdog

Bekanntes Mitglied
Wie kann man die Nachricht Comparable machen, denn wenn ich nur Collection.sort(nachrichten) mache funktioniert es nicht. Macht aber auch Sinn da ich nach nachricht.prioritaet sortieren möchte, aber leider weiss ich nicht wie man es sortiert bekommt.

Java:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;

class Nachricht {
  public Date uhrzeit;
  public String nachricht;
  public int prioritaet;
};

class NachrichtService {
  ArrayList<Nachricht> nachrichten = new ArrayList<Nachricht>();
  int neachstePos = 0;

  public void addNachricht(int prioritaet, String msg) {
    Nachricht nachricht = new Nachricht();
    nachricht.nachricht = msg;
    nachricht.uhrzeit = new Date();
    nachricht.prioritaet = prioritaet;
    nachrichten.add(nachricht);
  }

  public Nachricht getNaechsteNachricht() {
    int pos = neachstePos;
    Collections.sort(nachrichten.);
    neachstePos++;
    return nachrichten.get(pos);
  }
};

public class NachrichtenTest {

  public static void main(String[] args) {
    NachrichtService nservice = new NachrichtService();
    nservice.addNachricht(3,	"N 1");
    nservice.addNachricht(2,	"N 2");
    nservice.addNachricht(3,	"N 3");
    nservice.addNachricht(1,	"N 4");

    Nachricht n = nservice.getNaechsteNachricht();
    System.out.println(n.nachricht + " " + n.uhrzeit.getHours() + ":" + n.uhrzeit.getMinutes());
  }
}

Oder gibt es eine andere Datenstruktur um nachriten nach nachrichten.prioritaet zu sortieren?
 

nrg

Top Contributor
du musst in die Klasse Nachricht das Interface Comparable implementieren und dann die Methode compareTo überschreiben.
 
S

SlaterB

Gast
du brauchst ein Sortierverfahren, dass entweder direkt die richtigen Felder abfragt oder sich auf das allgemeine Interface Comparable verlässt,
für letzteres gibt es schon Collections.sort, dann musst du nur noch Comparable implementieren

ich sehe keinen Sinn darin, das dir zu erklären, das ist ein sehr großes Grundthema in Java, lies dir dazu die 20 Seiten im Lehrbuch durch,
oder schaue bei google nach Beispielen

einen eigenen Sortieralgorithmus findet man bei google sicher auch, im Grunde muss man da das andere aber auch mit einbauen,
ist nicht leichter, kann man dennoch irgendwann mal machen, um zu verstehen, was Collections.sort leistet,
ein einfacher Algorithmus ist z.B. BubbleSort
Google
schnell gefunden, aber den dann auf deine Nachrichten anzupassen ist wie gesagt auch nicht leichter
 

nrg

Top Contributor
z.b. so

Solltest dich auch bemühen etwas mehr OO zu programmieren. Kapseln/Konstruktoren/Getter/Setter (getter/setter hab ich mal dir überlassen, weil man sie bis jetzt noch nicht braucht)

Java:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
 
class Nachricht implements Comparable<Nachricht>{
	
	private int prioritaet;
	private String nachricht;
	private Date uhrzeit;
  
	public Nachricht(int prioritaet, String nachricht, Date uhrzeit){
		this.prioritaet = prioritaet;
		this.nachricht = nachricht;
		this.uhrzeit = uhrzeit;
	}
	@Override
	public int compareTo(Nachricht o) {
		if (this == o)
			return 0;
		else (this.prioritaet > o.prioritaet)
			return 1;
		else if (this.prioritaet < o.prioritaet)
			return -1;
		else
			return this.uhrzeit.compareTo(o.uhrzeit);
	}
	@SuppressWarnings("deprecation")
	@Override
	public String toString(){
		return "Prio:" + prioritaet + " - " + nachricht + " - " + uhrzeit.getHours() + ":" + uhrzeit.getMinutes();
	}
}
 
class NachrichtService {
	List<Nachricht> nachrichten;;
	private int neachstePos = 0;
 
	public NachrichtService(){
		nachrichten = new ArrayList<Nachricht>();
	}
	public void addNachricht(int prioritaet, String msg) {
		nachrichten.add(new Nachricht(prioritaet, msg, new Date()));
	}
 
	public Nachricht getNaechsteNachricht() {
		int pos = neachstePos;
		neachstePos++;
		return nachrichten.get(pos);
	}
  
	public void sortAndPrintNews(){
		Collections.sort(nachrichten);
		for (Nachricht n : nachrichten)
			System.out.println(n);
  }
}
 
public class Tester {
	public static void main(String[] args) {
		NachrichtService nservice = new NachrichtService();
		nservice.addNachricht(3,    "N 1");
		nservice.addNachricht(2,    "N 2");
		nservice.addNachricht(3,    "N 3");
		nservice.addNachricht(4,    "N 5");
		nservice.addNachricht(8,    "N 6");
		nservice.addNachricht(5,    "N 7");
		nservice.addNachricht(10,    "N 8");
		nservice.addNachricht(9,    "N 9");
 
		nservice.sortAndPrintNews();
	}
}

sortAndPrintNews() gibt alle Nachrichten primär nach Prio sekundär nach Uhrzeit sortiert aus. Die toString() evtl noch nach Wunsch anpassen.

btw: Date ist deprecated. Vllt dafür lieber GregorianCalendar nehmen.

edit: in der toString() sollte es natürlich Prio: heissen ;)
 
Zuletzt bearbeitet:

flashdog

Bekanntes Mitglied
Danke es funktioniert. Wozu dient diese Bedingung in compareTo(Nachricht o):
Java:
        if (this == o)
            return 0;
 
S

SlaterB

Gast
ist dir der Sinn des Rückgabewerts nicht klar? ob 0, -1 oder +1 zurückgegeben wird ist alles extrem wichtig, siehe Lehrbuch

und es kann nunmal vorkommen, dass ein Objekt mit sich selber verglichen wird, dann ist klar was am Ende rauskommt,
statt nun alle Vergleiche durchexerzieren kann man auch gleich das Endergebnis zurückgeben,

beim Überschreiben einer equals()-Methode bietet sich das übrigens genauso an, falls du die kennst
 

flashdog

Bekanntes Mitglied
Danke. Ich habe versucht den Code mit Enums zu erweitern damit der User "Niedrig", "Mittel" und "Hoch" eingeben kann anstatt 0, 1, 2, aber leider weiss ich nicht ob ich enum an der richtigen Stelle definiert habe. Ich dachte das Enums wie Integer Werte behandelt werden und deshalb die compareTo Methode richtig sein sollte, aber leider trifft das nicht zu oder ich habe etwas falsch gemacht.

Java:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

class Nachricht implements Comparable<Nachricht>{
    enum prioritaetTyp {Niedrig, Mittel, Hoch};

    private prioritaetTyp prioritaet;
    private String nachricht;
    private Date uhrzeit;

    public Nachricht(prioritaetTyp prioritaet, String nachricht, Date uhrzeit){
        this.prioritaet = prioritaet;
        this.nachricht = nachricht;
        this.uhrzeit = uhrzeit;
    }
    @Override
    public int compareTo(Nachricht o) {
        if (this == o)
            return 0;
        else if (this.prioritaet. > o.prioritaet)
            return 1;
        else if (this.prioritaet < o.prioritaet)
            return -1;
        else
            return this.uhrzeit.compareTo(o.uhrzeit);
    }
    @SuppressWarnings("deprecation")
    @Override
    public String toString(){
        return "Prio:" + prioritaet + " - " + nachricht + " - " + uhrzeit.getHours() + ":" + uhrzeit.getMinutes();
    }
}

class NachrichtService {
    List<Nachricht> nachrichten;
    private int neachstePos = 0;

    public NachrichtService(){
        nachrichten = new ArrayList<Nachricht>();
    }
    public void addNachricht(String prioritaet, String msg) {
        nachrichten.add(new Nachricht(prioritaet, msg, new Date()));
    }

    public Nachricht getNaechsteNachricht() {
        int pos = neachstePos;
        neachstePos++;
        return nachrichten.get(pos);
    }

    public void sortAndPrintNews(){
        Collections.sort(nachrichten);
        for (Nachricht n : nachrichten)
            System.out.println(n);
  }
}

public class Tester {
    public static void main(String[] args) {
        NachrichtService nservice = new NachrichtService();
        nservice.addNachricht("Hoch",    "N 1");
        nservice.addNachricht("Hoch",    "N 2");
        nservice.addNachricht("Niedrig",    "N 3");
        nservice.addNachricht("Mittel",    "N 5");
        nservice.addNachricht("Mittel",    "N 6");
        nservice.addNachricht("Niedrig",    "N 7");
        nservice.addNachricht("Niedrig",    "N 8");
        nservice.addNachricht("Mittel",    "N 9");

        nservice.sortAndPrintNews();
    }
}

Dieser Code verursacht diese Fehler:
Code:
Tester.java:22: <identifier> expected
        else if (this.prioritaet. > o.prioritaet)
1 error

Wie bekommt man den gefixt?
 

AmunRa

Gesperrter Benutzer
du hast einen Punkt zu viel in der Zeile 22

statt [c] else if (this.prioritaet. > o.prioritaet)[/c] muss es [c] else if (this.prioritaet > o.prioritaet)[/c]

heißen
 
Zuletzt bearbeitet von einem Moderator:

Empire Phoenix

Top Contributor
Enumerations sid tatsächlih versteckte klassen (oder so ähnlich) die haben eine Methode womit man den int wert bekommen kann.

Ich empfehle mal die JavaDoc zu benutzen oder wenn du eine IDE nimmst (zb eclipse) die so einzustellen, das sie dir alle methoden anzeigt die die jeweiligen objecte können. (Ist schon ne tolle sache, ausserdem spart ma sich ne menge Zeit wenn man nicht genau weiß wie die methode geschreiben wird oder welche argumente sie braucht)
 
S

SlaterB

Gast
mal beide ähnlichen Zeilen direkt hintereinandergeschrieben:
Java:
else if (this.prioritaet. > o.prioritaet)
else if (this.prioritaet < o.prioritaet)
dir fällt kein Unterschied auf? beim Programmieren hat jedes Zeichen, oft sogar die Leerzeichen, zumindest jeweils das erste, eine Bedeutung

(edit: auf letztes Posting erste Seite bezogen, Rest nicht gesehen ;) )
 

flashdog

Bekanntes Mitglied
Danke, aber leider macht der Code folgende Problem:
Code:
Tester.java:22: operator > cannot be applied to Nachricht.prioritaetTyp,Nachricht.prioritaetTyp
    } else if (this.prioritaet > o.prioritaet) {
Tester.java:24: operator < cannot be applied to Nachricht.prioritaetTyp,Nachricht.prioritaetTyp
    } else if (this.prioritaet < o.prioritaet) {
Tester.java:48: cannot find symbol
symbol  : constructor Nachricht(java.lang.String,java.lang.String,java.util.Date)
location: class Nachricht
    nachrichten.add(new Nachricht(prioritaet, msg, new Date()));
3 errors

Java:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

class Nachricht implements Comparable<Nachricht>{
    enum prioritaetTyp {Niedrig, Mittel, Hoch};

    private prioritaetTyp prioritaet;
    private String nachricht;
    private Date uhrzeit;

    public Nachricht(prioritaetTyp prioritaet, String nachricht, Date uhrzeit){
        this.prioritaet = prioritaet;
        this.nachricht = nachricht;
        this.uhrzeit = uhrzeit;
    }
    @Override
    public int compareTo(Nachricht o) {
        if (this == o){
            return 0;
    } else if (this.prioritaet. > o.prioritaet) {
      return 1;
    } else if (this.prioritaet < o.prioritaet) {
      return -1;
    } else {
      return this.uhrzeit.compareTo(o.uhrzeit);
    }
  }

  @SuppressWarnings("deprecation")
  @Override
  public String toString() {
    return "Prio:" + prioritaet + " - " + nachricht + " - " + uhrzeit.getHours() + ":" + uhrzeit.getMinutes();
  }
}

class NachrichtService {

  List<Nachricht> nachrichten;
  private int neachstePos = 0;

  public NachrichtService() {
    nachrichten = new ArrayList<Nachricht>();
  }

  public void addNachricht(String prioritaet, String msg) {
    nachrichten.add(new Nachricht(prioritaet, msg, new Date()));
  }

  public Nachricht getNaechsteNachricht() {
    int pos = neachstePos;
    neachstePos++;
    return nachrichten.get(pos);
  }

  public void sortAndPrintNews() {
    Collections.sort(nachrichten);
    for (Nachricht n : nachrichten) {
      System.out.println(n);
    }
  }
}

public class Tester {

  public static void main(String[] args) {
    NachrichtService nservice = new NachrichtService();
    nservice.addNachricht("Hoch", "N 1");
    nservice.addNachricht("Hoch", "N 2");
    nservice.addNachricht("Niedrig", "N 3");
    nservice.addNachricht("Mittel", "N 5");
    nservice.addNachricht("Mittel", "N 6");
    nservice.addNachricht("Niedrig", "N 7");
    nservice.addNachricht("Niedrig", "N 8");
    nservice.addNachricht("Mittel", "N 9");

    nservice.sortAndPrintNews();
  }
}

Wie kann man den Kode zum laufen bekommen?
 

eRaaaa

Top Contributor
Es haben dir doch jetzt schon mind. 2 Personen gesagt dass in der Zeile 22

Java:
    } else if (this.prioritaet. > o.prioritaet) {

ein Punkt enthalten ist der da nichts zu suchen hat. Ausserden kannst du > < nicht auf Enumeration anwenden....sie haben allerdings selbst eine compareTo Methode die du benutzen kannst in dem Fall !

Ausserdem (wenn ich das richtig sehe) will dein Konstruktor als ersten Parameter einen prioritaetsTypen(enum) und keinen String so wie du es aber in addNachricht tust
Java:
  public void addNachricht(String prioritaet, String msg) {
    nachrichten.add(new Nachricht(prioritaet, msg, new Date()));  //blub ?!?!?
  }
 

flashdog

Bekanntes Mitglied
Danke, den Punkt habe ich nach dem kompilieren eingefügt um mir die Liste der möglichen Methoden anzuzeigen zu lassen und habe es dann vergessen zu löschen.

Code:
Tester.java:47: cannot find symbol
symbol  : class prioritaetTyp
location: class NachrichtService
  public void addNachricht(prioritaetTyp prioritaet, String msg) {
1 error

Java:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

class Nachricht implements Comparable<Nachricht>{
    enum prioritaetTyp {Niedrig, Mittel, Hoch};

    private prioritaetTyp prioritaet;
    private String nachricht;
    private Date uhrzeit;

    public Nachricht(prioritaetTyp prioritaet, String nachricht, Date uhrzeit){
        this.prioritaet = prioritaet;
        this.nachricht = nachricht;
        this.uhrzeit = uhrzeit;
    }
    @Override
    public int compareTo(Nachricht o) {
        if (this == o){
            return 0;
    } else if (this.prioritaet.compareTo(o.prioritaet) == 1) {
      return 1;
    } else if (this.prioritaet.compareTo(o.prioritaet) == -1) {
      return -1;
    } else {
      return this.uhrzeit.compareTo(o.uhrzeit);
    }
  }

  @SuppressWarnings("deprecation")
  @Override
  public String toString() {
    return "Prio:" + prioritaet + " - " + nachricht + " - " + uhrzeit.getHours() + ":" + uhrzeit.getMinutes();
  }
}

class NachrichtService {

  List<Nachricht> nachrichten;
  private int neachstePos = 0;

  public NachrichtService() {
    nachrichten = new ArrayList<Nachricht>();
  }

  public void addNachricht(prioritaetTyp prioritaet, String msg) {
    nachrichten.add(new Nachricht(prioritaet, msg, new Date()));
  }

  public Nachricht getNaechsteNachricht() {
    int pos = neachstePos;
    neachstePos++;
    return nachrichten.get(pos);
  }

  public void sortAndPrintNews() {
    Collections.sort(nachrichten);
    for (Nachricht n : nachrichten) {
      System.out.println(n);
    }
  }
}

public class Tester {

  public static void main(String[] args) {
    NachrichtService nservice = new NachrichtService();
    nservice.addNachricht("Hoch", "N 1");
    nservice.addNachricht("Hoch", "N 2");
    nservice.addNachricht("Niedrig", "N 3");
    nservice.addNachricht("Mittel", "N 5");
    nservice.addNachricht("Mittel", "N 6");
    nservice.addNachricht("Niedrig", "N 7");
    nservice.addNachricht("Niedrig", "N 8");
    nservice.addNachricht("Mittel", "N 9");

    nservice.sortAndPrintNews();
  }
}

Wie bekommen ich nur den letzten Bug gefixt?
 

eRaaaa

Top Contributor
Zeile 47 -->
Java:
 public void addNachricht(Nachricht.prioritaetTyp prioritaet, String msg) {

Zeilen 69-76...willst du da nun einen String oder die enum-Konstante übergeben ??
Da du das ja jetzt zu enum geändert hast müsste es beispielsweise
Java:
	nservice.addNachricht(Nachricht.prioritaetTyp.Niedrig, "N 1");

heißen.

Oder du belässt es bei String, dann müsstest du aber wieder die Methode addNachricht anpassen
Java:
    public void addNachricht(String prioritaet, String msg) {
	nachrichten.add(new Nachricht(Nachricht.prioritaetTyp.valueOf(prioritaet), msg, new Date()));
    }

Was du nun willst, musst du entscheiden :)
 

flashdog

Bekanntes Mitglied
Danke, der Code funktioniert, aber das sortieren klappt noch nicht ganz:
Java:
Prio: Niedrig - N 1 - 19:35
Prio: Mittel - N 3 - 19:35
Prio: Hoch - N 2 - 19:35
Prio: Niedrig - N 5 - 19:35
Prio: Mittel - N 7 - 19:35
Prio: Hoch - N 6 - 19:35
d.h. wie könnte man die Prioritäten sortieren?

Der aktuelle code sieht wie folgt aus:
Java:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

class Nachricht implements Comparable<Nachricht>{
    enum prioritaetTyp {Niedrig, Mittel, Hoch};

    private prioritaetTyp prioritaet;
    private String nachricht;
    private Date uhrzeit;

    public Nachricht(prioritaetTyp prioritaet, String nachricht, Date uhrzeit){
        this.prioritaet = prioritaet;
        this.nachricht = nachricht;
        this.uhrzeit = uhrzeit;
    }

    @Override
    public int compareTo(Nachricht o) {
        if (this == o){
            return 0;
    } else if (this.prioritaet.compareTo(o.prioritaet) == 1) {
      return 1;
    } else if (this.prioritaet.compareTo(o.prioritaet) == -1) {
      return -1;
    } else {
      return this.uhrzeit.compareTo(o.uhrzeit);
    }
  }

  @SuppressWarnings("deprecation")
  @Override
  public String toString() {
    return "Prio: " + prioritaet + " - " + nachricht + " - " + uhrzeit.getHours() + ":" + uhrzeit.getMinutes();
  }
}

class NachrichtService {

  List<Nachricht> nachrichten;
  private int neachstePos = 0;

  public NachrichtService() {
    nachrichten = new ArrayList<Nachricht>();
  }

  public void addNachricht(Nachricht.prioritaetTyp prioritaet, String msg) {
    nachrichten.add(new Nachricht(prioritaet, msg, new Date()));
  }

  public void sortAndPrintNews() {
    Collections.sort(nachrichten);
    for (Nachricht n : nachrichten) {
      System.out.println(n);
    }
  }
}

public class Tester {

  public static void main(String[] args) {
    NachrichtService nservice = new NachrichtService();
    nservice.addNachricht(Nachricht.prioritaetTyp.Niedrig, "N 1");
    nservice.addNachricht(Nachricht.prioritaetTyp.Hoch, "N 2");
    nservice.addNachricht(Nachricht.prioritaetTyp.Mittel, "N 3");
    nservice.addNachricht(Nachricht.prioritaetTyp.Niedrig, "N 5");
    nservice.addNachricht(Nachricht.prioritaetTyp.Hoch, "N 6");
    nservice.addNachricht(Nachricht.prioritaetTyp.Mittel, "N 7");

    nservice.sortAndPrintNews();
  }
}
 

nrg

Top Contributor
Die compareTo() anpassen (wegen deinem enum)
z.b.:
Java:
	@Override
	public int compareTo(Nachricht o) {
		if (this == o){
			return 0;
		} else if (this.prioritaet.ordinal() > o.prioritaet.ordinal()) {
			return 1;
		} else if (this.prioritaet.ordinal() < o.prioritaet.ordinal()) {
			return -1;
		} else {
			return this.uhrzeit.compareTo(o.uhrzeit);
		}
	}

das sortiert dir erst nach Priorität dann nach Uhrzeit (Sortierreihenfolge ist Enumreihenfolge von links nach rechts)
 

flashdog

Bekanntes Mitglied
Danke, Ich glaube es hat funktioniert denn ich bekomme diese Ausgabe:
Code:
Prio: Niedrig - N 1 - 10:12:13:14
Prio: Niedrig - N 5 - 10:12:13:14
Prio: Mittel - N 3 - 10:12:13:14
Prio: Mittel - N 7 - 10:12:13:14
Prio: Hoch - N 2 - 10:12:13:14
Prio: Hoch - N 6 - 10:12:13:14

Ich habe GregorianCalendar aktualisiert, aber ich bekomme falsche Uhrzeit angezeigt. Was mache ich falsch?

Warum ist else { return this.uhrzeit.compareTo(o.uhrzeit);} nicht in der ersten if Bedingung drin?

Java:
import java.util.ArrayList;
import java.util.Collections;
import java.util.GregorianCalendar;
import java.util.List;

class Nachricht implements Comparable<Nachricht>{
    enum prioritaetTyp {Niedrig, Mittel, Hoch};

    private prioritaetTyp prioritaet;
    private String nachricht;
    private GregorianCalendar  uhrzeit;

    public Nachricht(prioritaetTyp prioritaet, String nachricht, GregorianCalendar uhrzeit){
        this.prioritaet = prioritaet;
        this.nachricht = nachricht;
        this.uhrzeit = uhrzeit;
    }

    @Override
    public int compareTo(Nachricht o) {
      /*
       -1 represent o that is less than the one we’re checking against.
        0 represent o of equal values
        1 represent o that is more than the one we’re checking.
       */
        if (this == o){
            return 0;
        } else if (this.prioritaet.ordinal() > o.prioritaet.ordinal()) {
            return 1;
        } else if (this.prioritaet.ordinal() < o.prioritaet.ordinal()) {
            return -1;
        } else {
            return this.uhrzeit.compareTo(o.uhrzeit);
        }
  }

  @Override
  public String toString() {
    return "Prio: " + prioritaet + " - " + nachricht + " - " + uhrzeit.HOUR
            + ":" + uhrzeit.MINUTE + ":" + uhrzeit.SECOND + ":" + uhrzeit.MILLISECOND;
  }
}

class NachrichtService {

  List<Nachricht> nachrichten;
  private int neachstePos = 0;

  public NachrichtService() {
    nachrichten = new ArrayList<Nachricht>();
  }

  public void addNachricht(Nachricht.prioritaetTyp prioritaet, String msg) {
    nachrichten.add(new Nachricht(prioritaet, msg, new GregorianCalendar()));
  }

  public void sortAndPrintNews() {
    Collections.sort(nachrichten);
    for (Nachricht n : nachrichten) {
      System.out.println(n);
    }
  }
}

public class Tester {

  public static void main(String[] args) {
    NachrichtService nservice = new NachrichtService();
    nservice.addNachricht(Nachricht.prioritaetTyp.Niedrig, "N 1");
    nservice.addNachricht(Nachricht.prioritaetTyp.Hoch, "N 2");
    nservice.addNachricht(Nachricht.prioritaetTyp.Mittel, "N 3");
    nservice.addNachricht(Nachricht.prioritaetTyp.Niedrig, "N 5");
    nservice.addNachricht(Nachricht.prioritaetTyp.Hoch, "N 6");
    nservice.addNachricht(Nachricht.prioritaetTyp.Mittel, "N 7");

    nservice.sortAndPrintNews();
  }
}
 
S

SlaterB

Gast
HOUR usw. sind statische Konstanten, rufe cal.get(Calendar.HOUR) auf usw.,
bzw. hole dir mit getTime() ein Date-Objekt und gib das direkt aus oder per SimpleDateFormat

> Warum ist else { return this.uhrzeit.compareTo(o.uhrzeit);} nicht in der ersten if Bedingung drin?

?
im ersten if steht eine Bedingung und Code danach, wieso sollte anderer Code mit 'drin' sein?
 

nrg

Top Contributor
Warum ist else { return this.uhrzeit.compareTo(o.uhrzeit);} nicht in der ersten if Bedingung drin?

die Frage ist - wie Slater schon meinte - ein wenig falsch formuliert aber durchaus berechtigt (vorausgesetzt ich verstehe sie richtig ;) - "Warum ist return this.uhrzeit.compareTo(o.uhrzeit); nicht im ersten if-body drin?")

Weil im ersten if auf referenzielle Gleichheit geprüft wird. Wenn die beiden Objekte die gleiche Referenz haben handelt es sich um exakt das selbe Objekt. Dh this.uhrzeit.compareTo(o.uhrzeit) würde auch 0 zurückgeben, weil die Uhrzeit natürlich auch die Gleiche wäre.
 

DaveX

Mitglied
Wenn die compare Methode fetig ist würde ich vorschlagen eine PriorityQueue (Java 2 Platform SE 5.0) zu benutzen.

Da werden alle Nchrichten automatisch je nach der funktionsweise der compareTo Funktion sortiert, und du musst statt getNext die pull Funktion aufrufen.

Das wäre dann priorisierte Nachrichtenwarteschlange - ein wenig eleganter als alles per Hand zu sortieren.

@EDIT:

zu Sortierung ist Date ein wenig umständlich - so konnte man mit System.currentTimeMillis() eine long haben die man besser vergleichen kann und anschliessend zu Date für die Ausgabe parsen mit:
DateFormatUtils.formatUTC(System.currentTimeMillis(), "MM/dd/yy HH:mm")

man braucht aber diesen import:
import org.apache.commons.lang.time.DateFormatUtils
 
Zuletzt bearbeitet:

flashdog

Bekanntes Mitglied
Danke für die Erläuterung für "return this.uhrzeit.compareTo(o.uhrzeit)"

Habe die Methode toString wie folgt geändert
Java:
  @Override
  public String toString() {
    GregorianCalendar cal = new GregorianCalendar();

    return "Prio: " + prioritaet + " - " + nachricht + " - " + cal.get(uhrzeit.HOUR)
            + ":" + cal.get(uhrzeit.MINUTE) + ":" + cal.get(uhrzeit.SECOND)
            + ":" + cal.get(uhrzeit.MILLISECOND);
  }

aber Netbeans gibt mir diese Meldung "Accessing static field HOUR" und die Ausgabe vom Programm sieht wie folgt aus:

Code:
Prio: Niedrig - N 1 - 11:32:13:825
Prio: Niedrig - N 5 - 11:32:13:843
Prio: Mittel - N 3 - 11:32:13:844
Prio: Mittel - N 7 - 11:32:13:846
Prio: Hoch - N 2 - 11:32:13:847
Prio: Hoch - N 6 - 11:32:13:848

Leider weiss ich nicht wie DateFormatUtils.formatUTC(System.currentTimeMillis(), "MM/dd/yy HH:mm") benutzt.

Wie bekommt man die Meldung "Accessing static field HOUR" korrigiert?
 

flashdog

Bekanntes Mitglied
Danke. Habe es wie folgt korrigiert
Java:
  @Override
  public String toString() {
     return "Prio: " + prioritaet + " - " + nachricht + " - " + uhrzeit.get(Calendar.HOUR)
            + ":" + uhrzeit.get(Calendar.MINUTE) + ":" + uhrzeit.get(Calendar.SECOND)
            + ":" + uhrzeit.get(Calendar.MILLISECOND);
  }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
J Klassen Problem Java Basics - Anfänger-Themen 8
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
B Erste Schritte Problem bei der Verknüpfung von zwei klassen Java Basics - Anfänger-Themen 8
S Problem mit Klassen-/Methodenstruktur Java Basics - Anfänger-Themen 8
G Klassen Problem mit mehreren Klassen Java Basics - Anfänger-Themen 2
C Erste Schritte Problem mit Klassen. Java Basics - Anfänger-Themen 15
J Problem mit Klassen und Methoden Java Basics - Anfänger-Themen 7
P Klassen Klassen mit Array Problem Java Basics - Anfänger-Themen 4
1 Klassen Problem Java Basics - Anfänger-Themen 6
megachucky regex-Problem ( mit den Klassen Matcher / Pattern) --> XML prüfen Java Basics - Anfänger-Themen 11
J Methoden/Klassen Problem Java Basics - Anfänger-Themen 9
4 OOP Problem beim Speichern verschiedener Klassen in verschiedenen Dateien Java Basics - Anfänger-Themen 25
E 2 Klassen - Problem bei Methoden Java Basics - Anfänger-Themen 22
D Problem mit Klassen Bsp. Java Basics - Anfänger-Themen 3
A Taschenrechner - Problem mit zwei Klassen Java Basics - Anfänger-Themen 6
J Problem mit inneren Klassen und Klassenvariablen Java Basics - Anfänger-Themen 11
M Problem mit dem Klassen aus dem java.io Paket Java Basics - Anfänger-Themen 9
S Brauche Unterstützung bei Klassen-Problem. Java Basics - Anfänger-Themen 9
M [Einfaches Beispiel] Problem mit innere Klassen Java Basics - Anfänger-Themen 4
G Klassen Problem Java Basics - Anfänger-Themen 12
M Klassen-Problem Java Basics - Anfänger-Themen 5
K Wiederwerwenbare Klassen problem Java Basics - Anfänger-Themen 3
L Suche Hilfe , Problem mit Vektoren und klassen Java Basics - Anfänger-Themen 21
G Problem mit Objekten und Klassen. Java Basics - Anfänger-Themen 2
G Problem mit zwei Klassen Java Basics - Anfänger-Themen 8
T Methoden / Klassen Problem Java Basics - Anfänger-Themen 11
G Klassen Problem Java Basics - Anfänger-Themen 12
G Problem mit Klassen Java Basics - Anfänger-Themen 32
A problem: importieren von eigenen klassen Java Basics - Anfänger-Themen 3
frau-u Problem mit Klassen und Vererbung - benutzen von Methoden Java Basics - Anfänger-Themen 2
G Nochmal Problem mit Kommunikation zwischen Klassen Java Basics - Anfänger-Themen 3
G Problem mit PHP Klassen Java Basics - Anfänger-Themen 3
P Externe Klassen Problem - Eclipse Java Basics - Anfänger-Themen 4
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
Detlef Bosau Nachladen von Klassen zur Laufzeit Java Basics - Anfänger-Themen 24
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
C Array von Klassen Java Basics - Anfänger-Themen 2
monsterherz 2 Klassen daher Probs mit dem Dateinamen Java Basics - Anfänger-Themen 9
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 9
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
D Klassen Klassen Kommunikation Java Basics - Anfänger-Themen 12
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
L Best Practice Annotierte Klassen im Classpath herausfinden Java Basics - Anfänger-Themen 1
P Mit dem Scanner Klassen aufrufen Java Basics - Anfänger-Themen 3
O Klassen Zusammenspiel zwischen 2 Klassen Java Basics - Anfänger-Themen 1
K Zweite Ausgabe von vererbten Klassen Java Basics - Anfänger-Themen 3
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
Speedrunner klassen aufrufen Java Basics - Anfänger-Themen 41
M Log4J (v2) nachträglich in allen Klassen hinzufügen Java Basics - Anfänger-Themen 9
D importieren eigener Klassen Java Basics - Anfänger-Themen 12
W Wo ist der Wurm in meinem Grundverständnis von Klassen? Java Basics - Anfänger-Themen 22
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
elsaaaaaa Wochentag als String ausgeben mit JDK Klassen Java Basics - Anfänger-Themen 6
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
Z Mehtode bei Start des Programms ausführen (Klassen übergreifend) Java Basics - Anfänger-Themen 12
TimoN11 Java Klassen Global einbinden Java Basics - Anfänger-Themen 1
B Inventar als einzelne Klassen anlegen? Java Basics - Anfänger-Themen 12
G Java Klassen und Instanzmethoden Java Basics - Anfänger-Themen 15
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 3
T Vererbung Verschiedene Attribute für vererbte Klassen Java Basics - Anfänger-Themen 4
S Klassen instanziieren und verwenden von Getter und Setter Java Basics - Anfänger-Themen 4
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
H Methoden in großen Klassen gruppieren oder auslagern? Java Basics - Anfänger-Themen 10
G Abstrakte Klassen Java Basics - Anfänger-Themen 11
Y Klassen Klassen und Objekte Java Basics - Anfänger-Themen 3
Y Klassen Klassen und Objekte mit set und get Java Basics - Anfänger-Themen 0
A Generischen Klassen Java Basics - Anfänger-Themen 8
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
J 2 klassen benutzen Java Basics - Anfänger-Themen 5
A Klassen und methoden Java Basics - Anfänger-Themen 15
A Bankweverwaltung mit Klassen und Methoden Java Basics - Anfänger-Themen 14
I Java Klassen "Graphics" und "MouseEvent" kombinieren Java Basics - Anfänger-Themen 7
I Klassen als Datentyp nutzen? Java Basics - Anfänger-Themen 11
M Aufsplitten von Methoden in andere Klassen Java Basics - Anfänger-Themen 2
C Klassen objektorientiert aufteilen Java Basics - Anfänger-Themen 6
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
A Auf Eigenschaften von Objekten anderer Klassen zugreifen Java Basics - Anfänger-Themen 5
F Klassen und Pakete Projektübergreifend (Eclipse) Java Basics - Anfänger-Themen 6
V_Fynn03 Klassen Überweisungen tätigen und einzahlen mit 2 Klassen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben