instanceof Comparable...geht nicht?

Status
Nicht offen für weitere Antworten.

snowblind

Mitglied
Hi...ich versuch grad ne Queue zu programmieren, und will nun beim adden von elementen vorher überprüfen, dass auch nur elemente dazugefügt werden können, die vom gleichen Typ sind wie die, die schon drin sind.

Folgender Code wirft mir nun aber schon beim ersten element dass ich überhaupt einfügen will ne Exception:

Java:
import java.util.*;


/**
 * Write a description of class Queue here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Queue {
    //private static final int MAXSIZE = 3;
    private Object[] elements;
    private int maxSize;
    private int leseIndex;
    private int schreibIndex;
    
    Queue(int maxAnzahlEintraege){
        maxSize = maxAnzahlEintraege+1;
        elements = new Object[maxSize];
        leseIndex = schreibIndex = 0;
    }
        
    public boolean leer() {
        // Die Queue ist leer, wenn Lese- und Schreibindex auf dieselbe Position zeigen.
        return schreibIndex==leseIndex;
    }
    
    public boolean voll() {
        // Die Queue ist voll, wenn nach einer Schreiboperation der Schreibindex auf dieselbe Position
        // wie der Leseindex verweisen würde.
        return (schreibIndex+1)%maxSize==leseIndex;
    }
    
    public boolean add(Object o) throws Exception { // Hinzufügen eines neuen Eintrags an das Queue-Ende
        
        // ::::::::::::: folgende zwei zeilen machen die Probleme::::::::::::::::::::::::
        if (!(o instanceof Comparable)) 
            throw new Exception(o.toString() + " ist nicht vom gleichen Typ");
  
        if (voll())
            return false;
        elements[schreibIndex] = o;
        schreibIndex = (schreibIndex+1)%maxSize;
        
        System.out.println(toString());
        
        return true;
    }
    
    public Object remove() { // Entfernen der Eintrags von der Queue-Spitze
        if (leer())
            return null;
        Object erg = elements[leseIndex];
        leseIndex = (leseIndex+1)%maxSize;
        
        System.out.println(toString());
        
        return erg;
    }
    
    public String toString() { // Hilfsmethode zur Ausgabe des Queueinhalts
        String erg = "Queue: ";
        int i = leseIndex;
        while(i!=schreibIndex) {
            erg += "-> [" + elements[i] + "] ";
            i = (i+1)%maxSize;
        }
        return erg;
    }


}

Exception siehe ::::::: Markierung
Aber eigentlich müsste das doch so stimmen? Hab diesen part bei ner linkedList schonma genau so verwendet...

Btw mit z.b. Strings scheints zu gehn; Ich benutze aber als Elemente eine Klasse Auftrag...Einfach nur ne Klasse mit Attributen Auftragsnummer und Auftragsersteller, nix grossartiges.

..Naja, jedenfalls, wer kann mir sagen was ich falsch mach? Danke ^^

Mfg, snow
 
Zuletzt bearbeitet:

diggaa1984

Top Contributor
und diese auftragsklasse importiert das Comparable-Interface ja!? :D

ich denke mal ja, aber da es nich explizit von dir erwähnt wird, muss man ja nachfragen ^^
 

snowblind

Mitglied
Äääähmmmm...Nein? ^^"

Sorry ich hab echt schon oft probleme mit diesem Comparable Kram, das will ich irgendwie nich so recht verstehn...

Wenn ich das implementiere, meint er aber "class Auftrag is not abstract and does not override compareTo....." blabla
Aber ich brauch ja gar keine neue compareTo methode, ich will ja nix größenmässig vergleichen...will ja nur wissen obs vom selben Typ is.
 

Noctarius

Top Contributor
Aber deine Klasse muss die im Interface deklarierte Methode compareTo besitzen um dem Interface zu entsprechen.

Im schlimmsten Fall den gewrappten String (als Beispiel) durchschleifen.

public int compareTo(...) { return someString.compareTo(...); }
 

diggaa1984

Top Contributor
aeh .. ich les da zwischen den zeilen grad was ganz komisches ^^

"du willst nur wissen ob sie vom selben typ sind" .. aeh ich übersetz das mal als "you want to know if some elements are comparable to each other" !?!? das wäre ja ne Hintergrundinformation die man erstma rausbekommen muss ^^ .. das würde bedeuten du willst wissen ob 2 versch. Elemente miteinander vergleichbar sind, das ist alles andere als der Sinn hinterm Comparable-Interface :D
 

snowblind

Mitglied
aeh .. ich les da zwischen den zeilen grad was ganz komisches ^^

"du willst nur wissen ob sie vom selben typ sind" .. aeh ich übersetz das mal als "you want to know if some elements are comparable to each other" !?!? das wäre ja ne Hintergrundinformation die man erstma rausbekommen muss ^^ .. das würde bedeuten du willst wissen ob 2 versch. Elemente miteinander vergleichbar sind, das ist alles andere als der Sinn hinterm Comparable-Interface :D

yepp...so isses. Ich zitier mich mal selbst:
...will nun beim adden von elementen vorher überprüfen, dass auch nur elemente dazugefügt werden können, die vom gleichen Typ sind wie die, die schon drin sind.

Ich dachte das wäre dann klar? Jedenfalls is das genau so gemeint wie du gesagt hast ^^
Ich will in der GANZEN Queue nur Objekte EINES typs haben; und damit wollte ich das überprüfen...

Mir is aber grad noch ne Idee gekommen: Kann ich vllt einfach so schreiben:
Java:
if (!(o instanceof (  **datentyp von elements[leseIndex]** )))
Das müsste (nach Abfrage auf nullpointerException) doch eigentlich auch gehn...Nur weiss ich nich genau wie man den datentyp ermittelt; getInstance() scheint falsch zu sein ^^'
 

diggaa1984

Top Contributor
ich werf ma mit meim halbwissen rein:

o.getClass() == elemXY.getClass() .. notfalls ein toString.equals(elemXY.getClass().toString) .. oder sowas .. aber sieht mir alles mehr nach Hack aus als alles andere .. willst deine Queue nich gleich auf Generics umbaun :D
 

snowblind

Mitglied
Habs so versucht, geht aber auch nicht: (xD)
Java:
if (leseIndex != 0)
            if (!(o.getClass() ==   elements[leseIndex].getClass()  )) 
                throw new Exception(o.toString() + " ist nicht vom gleichen Typ");

Generics benutz ich nich, weil ich grad ma angefangen hab zu studiern und wir das noch nicht gemacht haben. Alles was ich über Generics zu glauben wisse is, dasses was mit spitzen Klammern < > zu tun hat ^____^ Ansonsten kein Plan, und die Profs setzen, wenn ich mich recht erinner, voraus, dass es auch so lösbar is (ohne Generics).

edit: zu wissen glaube
so sollte es heissen xD sorry
 

diggaa1984

Top Contributor
mach mal ein leseIndex-1 in die Klammer .. wenn leseIndex != 0 ist, zB 1 heisst das du hast 1 element gespeichert. Wenn du nun das nächste einfügst, dann versuchst du element[1] abzugreifen, was nich existent sein sollte .. zumindest wenn du den leseIndex beim adden veränderst .. vielleicht solltest besser den schreibIndex-1 verwenden ^^ .. wobei letzteres wieder hierbei querschlägt: schreibIndex = (schreibIndex+1)%maxSize;
 

snowblind

Mitglied
Ich bekomm keine Exception und garnichts, aber ich kann ohne Probleme Auftrags-Objete adden und dann noch nen String oder so...Und eben das sollte ja eigentlich nich gehn ^^'
 

diggaa1984

Top Contributor
ach das kann aber nich zufällig daran liegn (die Wissenden frag) das er da Object als Parameter hat .. und irgendwie ja alles von Object erbt?! Daher getClass auch das Gleiche liefert?
 

Schandro

Top Contributor
vllt. weil leseIndex fast immer 0 ist da du es nur in der Methode remove veränderst?

ach das kann aber nich zufällig daran liegn (die Wissenden frag) das er da Object als Parameter hat .. und irgendwie ja alles von Object erbt?! Daher getClass auch das Gleiche liefert?
Nein, wenn man die "Membermethoden" eines Objectes benutzt wird immer der Methodenbody der höchsten Klasse in der Klassenhierarchie genommen, egal von welchen Typ die Referenz ist.

Bei statischen Methoden würde der Methodenbody der Klasse benutzt werden, von dessen Typ die Referenz ist, aber darum gehts hier ja nicht


Übrigens sind diese ganzen Gedankengänge bei "getClass()" eh sinnlos, da getClass() final ist und deswegen überhaupt nicht überschrieben werden kann. Es wird irgendwie intern immer die tatsächliche Class des Objectes zurückgegeben.
 
Zuletzt bearbeitet:

snowblind

Mitglied
Naja...aber wie kann ich das dann anders machen? Ich hab echt keine Ahnung wie ne Lösung sein könnte...
Wie gesagt was ich will is: Beim adden von elementen vorher überprüfen, dass auch nur elemente dazugefügt werden können, die vom gleichen Typ sind wie die, die schon drin sind.

Und von Generics hab ich wie gesagt leider kein plan...und vorher gings auch einfach mit (o instanceof Comparable), bei nem ähnlichen Projekt, nur mit Stack / LinkedList.

Bitte helft mir...Ich weiss echt nich weiter xD
 

Landei

Top Contributor
Horch einfach auf die Leute und machs generisch:

Java:
public class Queue<T> {
  //private static final int MAXSIZE = 3;
  private final T[] elements;
  private int leseIndex = 0;
  private int schreibIndex = 0;

  Queue(Class<T> clazz, int maxAnzahlEintraege) {
    elements = (T[]) Array.newInstance(clazz, maxAnzahlEintraege + 1);
  }

  private int maxSize() {
    return elements.length;
  }

  public boolean leer() {
    // Die Queue ist leer, wenn Lese- und Schreibindex auf dieselbe Position zeigen.
    return schreibIndex == leseIndex;
  }

  public boolean voll() {
    // Die Queue ist voll, wenn nach einer Schreiboperation der Schreibindex auf dieselbe Position
    // wie der Leseindex verweisen würde.
    return (schreibIndex + 1) % maxSize() == leseIndex;
  }

  public boolean add(T t) throws Exception { // Hinzufügen eines neuen Eintrags an das Queue-Ende

    if (voll()) {
      return false;
    }
    elements[schreibIndex] = t;
    schreibIndex = (schreibIndex + 1) % maxSize();

    System.out.println(toString());

    return true;
  }

  public T remove() { // Entfernen der Eintrags von der Queue-Spitze
    if (leer()) {
      return null;
    }
    T erg = elements[leseIndex];
    leseIndex = (leseIndex + 1) % maxSize();

    System.out.println(toString());

    return erg;
  }

  public String toString() { // Hilfsmethode zur Ausgabe des Queueinhalts
    String erg = "Queue: ";
    int i = leseIndex;
    while (i != schreibIndex) {
      erg += "-> [" + elements[i] + "] ";
      i = (i + 1) % maxSize();
    }
    return erg;
  }

}

Ich hab nur deinen Code umgeschrieben, keine Ahnung, ob es so funktioniert...
 

snowblind

Mitglied
^^" Hab zum theme Generics meinem Prof nochma ne email geschrieben, es hiess die solln wir definitiv noch nich verwenden, weil wirs halt noch nich besprochen haben, und das Problem anders lösen...Wie ich befürchtet hatte : /
Muss also ne Lösung geben ausser Generics...

Und wie gesagt, ich versteh vorallem net, warums bei den zwei Projekten vorher mit instanceof comparable ging...Und hier nich o_O
 

faetzminator

Gesperrter Benutzer
also, am einfachsten wär doch wirklich
Java:
if (elements[0] != null && !elements[0].getClass().equals(o.getClass())) { 
    throw new Exception(o.toString() + " ist nicht vom gleichen Typ");
}
 

snowblind

Mitglied
also, am einfachsten wär doch wirklich
Java:
if (elements[0] != null && !elements[0].getClass().equals(o.getClass())) { 
    throw new Exception(o.toString() + " ist nicht vom gleichen Typ");
}

Hmm, tatsache o_O Dieses verdammte equals...Das is immer so ne Sache wenn ma net dran denkt.
Außerdem dachte ich das ginge nich, weil elements[0] immer ma wieder 0 wird, aber da hab ich ja wohl falsch gelegen ^^ Scheint prima zu klappen.

Dann sag ich ma dankeschön! Echt super Lösung...;)

Mfg \m/ (ò.Ó) \m/
 
V

Vayu

Gast
das klappt immer, weil falls elements an der Stelle 0 null ist, direkt nach dem ersten Term

Java:
elements[0] != null

abgebrochen wird und

Java:
!elements[0].getClass().equals(o.getClass())

nicht mehr ausgewertet wird, da der Ausdruck eh nicht mehr true zurückliefern könnte.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
NeoLexx Abfrage mit instanceof führt zu unerwarteten Wert Java Basics - Anfänger-Themen 9
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
S Gibt es eine Funktion, die gewissermaßen eine Reihe von instanceOf() vereinheitlicht? Java Basics - Anfänger-Themen 19
J instanceof Operator Java Basics - Anfänger-Themen 3
G instanceof in Generic Java Basics - Anfänger-Themen 7
A instanceof-if-else-Anweisungen eleganter lösen Java Basics - Anfänger-Themen 5
B instanceof Java Basics - Anfänger-Themen 9
L Best Practise - 'instanceof' oder nicht. Java Basics - Anfänger-Themen 7
Luk10 instanceof Class<T> Java Basics - Anfänger-Themen 6
I if (listenObjekt instanceof meinObjekt.class) Java Basics - Anfänger-Themen 5
A ArrayList-iteration mit Prüfung auf instanceof durch switch case? Java Basics - Anfänger-Themen 13
K Polymorphie und instanceOf Operator Java Basics - Anfänger-Themen 6
M Compiler-Fehler instanceof compiler-error Java Basics - Anfänger-Themen 2
A Alternative instanceof Java Basics - Anfänger-Themen 3
0 Vererbung - instanceof Java Basics - Anfänger-Themen 20
J this instanceof Class<Object> Java Basics - Anfänger-Themen 1
D HasMap mit JComponents mit instanceof Java Basics - Anfänger-Themen 3
K Equals,Instanceof und "==" Java Basics - Anfänger-Themen 7
A Datentypen instanceof VS Class - Vergleich Java Basics - Anfänger-Themen 4
S Bessere Lösung zu häufigem instanceof Java Basics - Anfänger-Themen 25
A Besser als instanceof Java Basics - Anfänger-Themen 6
E instanceof vs class==class Java Basics - Anfänger-Themen 5
B instanceof Prüfung für generische Typen Java Basics - Anfänger-Themen 5
K instanceof Java Basics - Anfänger-Themen 22
A Vereinfachung instanceof Java Basics - Anfänger-Themen 12
G Mit "instanceof" sich selbst Fragen? Java Basics - Anfänger-Themen 4
S Instanceof umkehren Java Basics - Anfänger-Themen 2
E Negative Abfrage auf instanceof Java Basics - Anfänger-Themen 3
D if (event.target instanceof TextField) Java Basics - Anfänger-Themen 2
J HashSet mit Comparable sortieren Java Basics - Anfänger-Themen 13
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
L Interface & Comparable Java Basics - Anfänger-Themen 15
I Generics und Comparable Java Basics - Anfänger-Themen 14
O Comparable Generic Java Basics - Anfänger-Themen 24
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
C Was macht `public class ClassName<T extends Comparable<T>>`? Java Basics - Anfänger-Themen 14
N Comparable bzw Comparator Java Basics - Anfänger-Themen 5
M Generische Liste aus Comparable-Objekten Java Basics - Anfänger-Themen 6
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
K Comparable - Objekte aus Array vergleichen und größtes auswählen Java Basics - Anfänger-Themen 1
Shizmo Frage zu Comparable Java Basics - Anfänger-Themen 4
L LinkedList Comparable < > MEHRFACH implementieren? Java Basics - Anfänger-Themen 3
N Datentypen LocalDate Generic Comparable Java Basics - Anfänger-Themen 2
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
N Compiler-Fehler Comparable / compareTo implementierung Java Basics - Anfänger-Themen 2
F Comparable mit String Java Basics - Anfänger-Themen 5
M Comparable und Comparator nicht ganz klar Java Basics - Anfänger-Themen 1
F Objekte sortieren mit Comparable Java Basics - Anfänger-Themen 9
R Mehrere Interfaces(Comparable, ...) Java Basics - Anfänger-Themen 2
B Comparable & Comparator Java Basics - Anfänger-Themen 9
C Comparable Interface Java Basics - Anfänger-Themen 8
T Interface Interface Comparable Problem... Java Basics - Anfänger-Themen 2
H Interface Comparable Verständnisfrage Java Basics - Anfänger-Themen 6
B Object "Method" in TreeSet, Fehler beim Vergleichen/Comparable Java Basics - Anfänger-Themen 9
pg1337 Interface Comparable-Interface bei HashMap Java Basics - Anfänger-Themen 21
J Probleme mit Comparable, compareTo() Java Basics - Anfänger-Themen 2
A Comparable interface Java Basics - Anfänger-Themen 26
I Interface Comparable für Server-Item-Interface Java Basics - Anfänger-Themen 12
P Comparable und Generics Java Basics - Anfänger-Themen 6
S comparable und equals Java Basics - Anfänger-Themen 7
S Unterschied Comparable und Comparator Java Basics - Anfänger-Themen 2
M Frage zum Interface Comparable Java Basics - Anfänger-Themen 3
S Comparable Java Basics - Anfänger-Themen 4
H Comparable und Comparator Java Basics - Anfänger-Themen 22
M comparable funktion & reverse funktion Java Basics - Anfänger-Themen 8
H Mehrere Comparable Java Basics - Anfänger-Themen 4
S Comparator / Comparable ? Java Basics - Anfänger-Themen 3
D Comparable - Bucketsort / Radixsort? Java Basics - Anfänger-Themen 2
B Mehrere Werte mit Comparable sortieren Java Basics - Anfänger-Themen 14
S String umwandeln in Comparable Java Basics - Anfänger-Themen 6
R Comparable Interface Funktionalität selbst programmieren? Java Basics - Anfänger-Themen 3
A Interface Comparable Java Basics - Anfänger-Themen 2
J Comparable Java Basics - Anfänger-Themen 9
D Frage zu Collection.sort bzw. Comparator u. Comparable Java Basics - Anfänger-Themen 2
B Wann Comparator und wann Comparable Java Basics - Anfänger-Themen 6
frau-u Wie vergleicht Comparable Java Basics - Anfänger-Themen 2
M Comparable - Bedingung erzwingen Java Basics - Anfänger-Themen 3
D MacOS: PDF erstellen geht nicht Java Basics - Anfänger-Themen 1
P Netbeans installation geht nicht Java Basics - Anfänger-Themen 26
Ostkreuz wie geht der catch? Java Basics - Anfänger-Themen 3
A Methoden Guten Tag , ich wollte so machen dass wenn meine frog an eine fly/bee geht dann an meine Tafel geht der zahl +1 hoch. Java Basics - Anfänger-Themen 2
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
B Explizit Array definieren geht nicht? Java Basics - Anfänger-Themen 14
Say Stelle in Code herausfinden, wie geht man vor? Java Basics - Anfänger-Themen 12
berserkerdq2 Geht collections.sort bei allen? Linkedhashset, ArrayList, HashSet etc. Java Basics - Anfänger-Themen 4
P Installation JRE 8u321 startet, geht aber nicht weiter Java Basics - Anfänger-Themen 1
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
E Pervasive PSQL insert funktion geht nicht Java Basics - Anfänger-Themen 9
U Warum kann ich die Methode in der ENUM Klasse nicht aufrufen? Und warum geht die Switch nicht? Java Basics - Anfänger-Themen 8
H Wie geht eigentlich Objektorientierung? Java Basics - Anfänger-Themen 14
M Methoden Wert einer Variable geht verloren? Java Basics - Anfänger-Themen 6
melisax Lower & Uppercase Beispielprogramm geht nicht Java Basics - Anfänger-Themen 3
MarcKKKK123 Wie geht das? Java Basics - Anfänger-Themen 1
B Static Attribute in einer Klasse, wie geht das? :O Java Basics - Anfänger-Themen 19
N methodenaufruf for each geht nicht Java Basics - Anfänger-Themen 2
O Methode in while-Schleife aufrufen geht nur beim ersten Mal Java Basics - Anfänger-Themen 2
W App geht live und dann? Java Basics - Anfänger-Themen 9
P Geht es vielleicht viel kürzer? Java Basics - Anfänger-Themen 7
S While-Schleife geht in Endlosschleife über, warum? Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben