Eigenen "Aufzählungstyp" erstellen - mit enum ?

ernst

Top Contributor
Hallo allerseits,
mein Ziel ist eine Art eigener Datentyp, bzw. viel einfacher:
ein "Aufzählungstyp", bei dem man die Elemente aufzählen kann.
Beispiel:
r, z, a, 0, 9, s, t
Daruf brauche ich eine Methode next(), die zu jedem Element das nachfolgende berechnet:
also:
nexz(r) = z
next(z) = a;
usw.
Natürlich könnte man sich eine eigene Klasse mit entsprechenden Methoden basteln.
Bei 7 Elementen ist das auch kein Aufwand.
Gibt es in Java schon einen vorgefertigten Datentyp, der so was für eine beliebige endliche Menge von vorgegebenen Elementen kann?
Mit enum habe ich es nicht hinbekommen.

mfg
Ern
 

Robat

Top Contributor
Meinst du sowas?
Java:
public enum Foo {
    R, Z, A, ZERO, NINE, S, T;
   public Foo next() {
         return values()[(ordinal()+1) % values().length];
    }
}
 

ernst

Top Contributor
Ein Problem habe ich noch:
Ich will den Wert der letzten Konstanten (hier c) in eimem Attribut speichern.
Leider wirft mir das Programm unten eine Exception.
Was muss man machen, dass es funktioniert?

mfg
Ern

Java:
enum Werte {
    a, b, c;

    public Werte last;
    
    private Werte(){
        last= values()[values().length-1];
    }
    
    public Werte next() {
        return values()[(ordinal() + 1) % values().length];
    }
}
 

Robat

Top Contributor
Wozu brauchst du das denn? Letztendlich kannst du im Konstruktor nicht auf `values()` zugreifen, da das Enum noch kompiliert wird und `values()` somit `null` sein sollte.
 

ernst

Top Contributor
Wozu brauchst du das denn? Letztendlich kannst du im Konstruktor nicht auf `values()` zugreifen, da das Enum noch kompiliert wird und `values()` somit `null` sein sollte.
Ich brauche es, um einen etwas "allgemeineren" Zähler zu implementieren.
Dazu muß ich feststellen, wann es einen Überlauf gibt.
Den gibt es bei Wert last.
Wie implementiert man last am einfachsten ?
Meine Idee mit dem Konstruktor funktioniert ja nicht.


mfg
Ern
 

ernst

Top Contributor
Habe es jetzt so gelöst:
Was meinst du dazu ?

Java:
enum Werte {
    a, b, c;

    public static Werte last;
    
    private Werte(){
        //last= values()[values().length-1];
    }
    
    public static void init(){
        last= values()[values().length-1];
    }
    
    public Werte next() {
        //System.out.println(this.ordinal());
        //last= values()[values().length-1];        
        return values()[(ordinal() + 1) % values().length];
    }
}
 

mrBrown

Super-Moderator
Mitarbeiter
Du musst nur in @Robat's Code next so anpassen, dass es nicht bei einem Überlauf von vorn anfängt, sondern eben irgendwas anderes macht.

Je nachdem was du vor hast, ist aber u.U. etwas anderes als Enums besser geeignet - was willst du damit denn machen?
 

Flown

Administrator
Mitarbeiter
Feingranularer könntest du es so gestalten:
Java:
enum MyEnum {

    a {
        @Override
        public MyEnum next() {
            return b;
        }

    }, b {
        @Override
        public MyEnum next() {
            return c;
        }
    }, c {
        @Override
        public MyEnum next() {
            return null;
        }

        @Override
        public boolean isLast() {
            return true;
        }
    };

    public abstract MyEnum next();

    public boolean isLast() {
        return false;
    }
}
 

ernst

Top Contributor
Du musst nur in @Robat's Code next so anpassen, dass es nicht bei einem Überlauf von vorn anfängt, sondern eben irgendwas anderes macht.

Je nachdem was du vor hast, ist aber u.U. etwas anderes als Enums besser geeignet - was willst du damit denn machen?
Einen allgemeinen Zähler.
Beispiel:
Die Grundelemnet des Zähler sind z.B. irgendeine geordnete Menge von Zeichen, wie z.B:
a, b, c

Damit wir ddann gezählt:
a,b,c,aa,ab,ac,abbb,cb, ...
Mit obigem Vorschlag hat es funktioniert.
Gibt es dazu etwas Besseres als enum ?

mfg
Ern
 

mrBrown

Super-Moderator
Mitarbeiter
Die Beschreibung klingt für mich zumindest nicht nach enum (das kommt aber tendenziell aus der Domäne, wenn man die nicht kennt wird das sowieso schwierig), die klingt bisher sehr abstrakt nach "irgendwas zählen".

Die Grundelemnet des Zähler sind z.B. irgendeine geordnete Menge von Zeichen, wie z.B:
a, b, c
Das kann man einfach als Liste darstellen

Einen allgemeinen Zähler.
Und dies als allgemeinen Zähler, der einfach eine Liste von Elementen bekommt. Nicht groß was anderes machst du mit dem Enum grad, aus einem aktuellem Element und einer Liste von allen ermittelst du das nächste Element.


Im aller simpelsten Fall:
Java:
public class Counter<T> {

    private int index = 0;

    private final T[] elems;

    public Counter(final T... elems) {
        this.elems = elems;
    }

    public T get() {
        return elems[index];
    }

    public T incrementAndGet() {
        index++;
        if (index >= elems.length) {
            index = 0;
        }
        return elems[index];
    }

    public static void main(String[] args) {
        Counter<Integer> stringCounter = new Counter<>(0, 1, 2, 3, 4);
        System.out.println(stringCounter.get());
        System.out.println(stringCounter.incrementAndGet());
        System.out.println(stringCounter.incrementAndGet());
        System.out.println(stringCounter.incrementAndGet());
        System.out.println(stringCounter.incrementAndGet());
    }

}
 

ernst

Top Contributor
Die Beschreibung klingt für mich zumindest nicht nach enum (das kommt aber tendenziell aus der Domäne, wenn man die nicht kennt wird das sowieso schwierig), die klingt bisher sehr abstrakt nach "irgendwas zählen".


Das kann man einfach als Liste darstellen


Und dies als allgemeinen Zähler, der einfach eine Liste von Elementen bekommt. Nicht groß was anderes machst du mit dem Enum grad, aus einem aktuellem Element und einer Liste von allen ermittelst du das nächste Element.

Ja, die Idee mit einer eigenen Klasse ist gut.
Daran hatte ich nicht mehr gedacht.

Eine Frage noch.
In einem enum kann man die Konstanten angeben, z.B:
a,b,c;

Ich habe aber sehr viele Konstanten.
Aus optischen Gründen will ich die auf mehrere Zeilen verteilen.
Das gefällt dem Compiler aber nicht.
Was muss ich machen ?

mfg
Ern
 

mrBrown

Super-Moderator
Mitarbeiter
0 ist kein gültiger Bezeichner in Java (genau wie alle anderen Literale.

Wie schon unterschwellig angedeutet: ich halte da die Nutzung eines Enums für falsch. Die einzelnen Werte sollen vermutlich einfach nur die jeweilen Zeichen darstellen - also nutzt man am besten auch einfach die Zeichen, zB in einer Liste, wie etwa in #11
 

ernst

Top Contributor
0 ist kein gültiger Bezeichner in Java (genau wie alle anderen Literale.

Wie schon unterschwellig angedeutet: ich halte da die Nutzung eines Enums für falsch. Die einzelnen Werte sollen vermutlich einfach nur die jeweilen Zeichen darstellen - also nutzt man am besten auch einfach die Zeichen, zB in einer Liste, wie etwa in #11
Ich benutzte also a,b, ..., z
Diese werden nachhner benutzt, um Ordner (bzw. Dateien) umzubenennnen.
Was erlaubt das Betriebsystem für Ordnernamen (bzw.) Dateinamen sonst noch außer a,....z

Später werde ich deinen Ratsclag berücksichtigen, eine eigene Klasse für einen Zähler zu bauen.

mfg
Ern
 

mrBrown

Super-Moderator
Mitarbeiter
Ich benutzte also a,b, ..., z
Diese werden nachhner benutzt, um Ordner (bzw. Dateien) umzubenennnen.
[...]
Später werde ich deinen Ratsclag berücksichtigen, eine eigene Klasse für einen Zähler zu bauen.
Dafür Enums zu nutzen ist völliger Unfug, fang damit bitte garnicht erst an...

Was erlaubt das Betriebsystem für Ordnernamen (bzw.) Dateinamen sonst noch außer a,....z
Das 0-9 in einem Enum nicht erlaubt sind, hat nichts mit Dateinamen zu tun, sondern ist rein Java-Seitig. Für Dateinamen gelten völlig andere Beschränkungen.

 

mihe7

Top Contributor
Diese werden nachhner benutzt, um Ordner (bzw. Dateien) umzubenennnen.
Ich gehe mal nicht davon aus, dass Du mehr als 2 Mrd. Dateinamen brauchst, oder? Dann reicht ein einfaches int um die Namen durchzuzählen.

Wenn Du die Zahl auf einen Strings abbilden willst, die aus einem Alphabet mit n Symbolen aufgebaut sind, dann betrachtest Du den String einfach als Zahl zur Basis n, also etwa:

Java:
public class Counter {
    private final char[] alphabet;
    private int value;

    public Counter(String alphabet) {
        this.alphabet = alphabet.toCharArray();
    }

    public String getAndIncrement() {
        String result = toString();
        value++;
        return result;
    }
    
    @Override
    public String toString() {
        StringBuilder b = new StringBuilder();
        int cur = value;
        int n = alphabet.length;

        while (cur > 0) {
            b.insert(0, alphabet[cur % n]);
            cur /= n;
        }
        
        if (b.length() == 0) {
            b.append(alphabet[0]);
        }
        
        return b.toString();
    }

    public static void main(String[] args) {
        Counter c = new Counter("abcdefghijklmnopqrstuvwxyz0123456789");
        for (int i = 0; i < 10000; i++) {
            System.out.println(i + ": " + c.getAndIncrement());
        }
    }
}
 

ernst

Top Contributor
Danke für den Tipp.
Habe etwas Ähnliches gemacht.

mfg
Ern


Java:
class Counter {
    // Basis des Zählers = Anzahl des Alphabets.
    // Beispiel: Alphabet = "abc" , also Basis = 3
    // 0,1,2, 00,01,02, 10,11,12,20,21,22, 000,001,002, ...

    private ArrayList<Integer> zählerstand;
    private int first;
    private int last;
    private final char[] alphabet;

    public Counter() {
        String alphabet = "abc";
        this.alphabet = alphabet.toCharArray();
        zählerstand = null;
        first = 0;
        last = this.alphabet.length - 1;

    }

    // Ein Kilometerzähler zur Bais n wird um 1 hochgezählt.
    public String getAndIncrementZählerstand() {
        int anz;
        int i;
        // Es gibt keinen Überlauf
        boolean überlauf = false;
        int lastPos = -1;
        ArrayList<Character> listeNeu;
        String zählerstandString = null;

        if (zählerstand == null) {
            zählerstand = new ArrayList();
            // am Anfang ein first (0) einfügen
            zählerstand.add(0, first);
            zählerstandString = zählerstandAlsString();
            return zählerstandString;
        }

        // Anzahl der Stellen des Zählers
        anz = zählerstand.size();

        // Bestimme letzte Stelle des Zählers , deren Wert noch erhöht werden
        // kann, ohne dass es einen Überlauf gibt.
        überlauf = true;
        for (i = anz - 1; i >= 0; i--) {
            if (zählerstand.get(i) != last) {
                lastPos = i;
                überlauf = false;
                break;
            }
        }

        // Alle Elemente sind mit last belegt d.h. es gibt einen Überlauf
        // ganz vorne an der 0-ten Stelle
        if (überlauf == true) {
            // alle Stellen mit first (0) belegen
            for (i = 0; i < anz; i++) {
                zählerstand.set(i, first);
            }
            // am Anfang ein first (0) einfügen
            zählerstand.add(0, first);
        } else { // Es gibt keinen Überlauf
            // alle Elemente ab lastPos+1 mit first belegen und lastPos um 1
            // erhöhen.
            for (i = lastPos + 1; i < anz; i++) {
                zählerstand.set(i, first);
            }
            int wert = zählerstand.get(lastPos);
            zählerstand.set(lastPos, wert + 1);

        }
        zählerstandString = zählerstandAlsString();
        return zählerstandString;
    }

    public String zählerstandAlsString() {
        StringBuffer sb = new StringBuffer();
        int index;
        for (int i = 0; i < zählerstand.size(); i++) {
            index = zählerstand.get(i);
            char c;
            c = alphabet[index];
            sb.append(c);
        }
        return sb.toString();
    }

    public String toString() {
        String temp;
        temp = zählerstand.toString();
        // vorsichtshalber Schrott entfernen
        temp = temp.replace("[", "");
        temp = temp.replace("]", "");
        temp = temp.replace(",", "");
        temp = temp.replace(" ", "");
        return temp;
    }

}
[QUOTE="mihe7, post: 1197582, member: 58041"]
Ich gehe mal nicht davon aus, dass Du mehr als 2 Mrd. Dateinamen brauchst, oder? Dann reicht ein einfaches int um die Namen durchzuzählen.

Wenn Du die Zahl auf einen Strings abbilden willst, die aus einem Alphabet mit n Symbolen aufgebaut sind, dann betrachtest Du den String einfach als Zahl zur Basis n, also etwa:

[code=Java]
public class Counter {
    private final char[] alphabet;
    private int value;

    public Counter(String alphabet) {
        this.alphabet = alphabet.toCharArray();
    }

    public String getAndIncrement() {
        String result = toString();
        value++;
        return result;
    }
  
    @Override
    public String toString() {
        StringBuilder b = new StringBuilder();
        int cur = value;
        int n = alphabet.length;

        while (cur > 0) {
            b.insert(0, alphabet[cur % n]);
            cur /= n;
        }
      
        if (b.length() == 0) {
            b.append(alphabet[0]);
        }
      
        return b.toString();
    }

    public static void main(String[] args) {
        Counter c = new Counter("abcdefghijklmnopqrstuvwxyz0123456789");
        for (int i = 0; i < 10000; i++) {
            System.out.println(i + ": " + c.getAndIncrement());
        }
    }
}
[/QUOTE]
Ich gehe mal nicht davon aus, dass Du mehr als 2 Mrd. Dateinamen brauchst, oder? Dann reicht ein einfaches int um die Namen durchzuzählen.

Wenn Du die Zahl auf einen Strings abbilden willst, die aus einem Alphabet mit n Symbolen aufgebaut sind, dann betrachtest Du den String einfach als Zahl zur Basis n, also etwa:

Java:
public class Counter {
    private final char[] alphabet;
    private int value;

    public Counter(String alphabet) {
        this.alphabet = alphabet.toCharArray();
    }

    public String getAndIncrement() {
        String result = toString();
        value++;
        return result;
    }
  
    @Override
    public String toString() {
        StringBuilder b = new StringBuilder();
        int cur = value;
        int n = alphabet.length;

        while (cur > 0) {
            b.insert(0, alphabet[cur % n]);
            cur /= n;
        }
      
        if (b.length() == 0) {
            b.append(alphabet[0]);
        }
      
        return b.toString();
    }

    public static void main(String[] args) {
        Counter c = new Counter("abcdefghijklmnopqrstuvwxyz0123456789");
        for (int i = 0; i < 10000; i++) {
            System.out.println(i + ": " + c.getAndIncrement());
        }
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Addons im eigenen Programm Allgemeine Java-Themen 1
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
dereki2000 Eigenen Zeichensatz benutzen Allgemeine Java-Themen 7
B JAVA Prozesse in einer eigenen Anwendung laufen lassen Allgemeine Java-Themen 9
J Java eigenen Button programmieren (ob Cursor im Rechteck ist oder nicht..../button pressed or not) Allgemeine Java-Themen 6
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
C Bufferoverflow beim eigenen simpeln Programm Allgemeine Java-Themen 4
F Grundrechenarten mit eigenen Typen Allgemeine Java-Themen 9
D Eigenen Objekt Pool Allgemeine Java-Themen 15
A Eigenen OutputStream schreiben und verwenden Allgemeine Java-Themen 9
D eigenen eventListener Allgemeine Java-Themen 5
X Duplikate aus eigenen Datentypen entfernen Allgemeine Java-Themen 14
H2SO3- jar soll eigenen namen(pfad) finden Allgemeine Java-Themen 12
R Eigenen Comparator schreiben ? Allgemeine Java-Themen 10
G Kennt jemand gute Produkte zum Lizensieren der eigenen Apps? Allgemeine Java-Themen 6
G Fragen zum eigenen Scheduler Allgemeine Java-Themen 4
thE_29 Java Prozesse der eigenen JVM Allgemeine Java-Themen 12
Escorter Eigenen Listener schreiben Allgemeine Java-Themen 3
C Eigenen Layout Manager schreiben Allgemeine Java-Themen 7
P Klasse über eigenen Classloader laden: SecurityException Allgemeine Java-Themen 11
M eigenen Desktop erzeugen Allgemeine Java-Themen 3
G hat jeder thread seinen eigenen stacktrace? Allgemeine Java-Themen 2
F Eigenen E-MailClient als Standart definieren Allgemeine Java-Themen 7
F "source not found" in eigenem Projekt mit eigenen Allgemeine Java-Themen 2
G ||| Textdateien aus dem eigenen Projekt lesen. Allgemeine Java-Themen 16
D close Problem bei meinem eigenen ToolTip Allgemeine Java-Themen 2
F Dateien auf dem eigenen Server verändern? Allgemeine Java-Themen 3
M Eigenen Datentyp erstellen Allgemeine Java-Themen 4
N Konsole im eigenen Java-Programm Allgemeine Java-Themen 4
N warning beim compilieren des eigenen TableRenderers Allgemeine Java-Themen 5
G Fenster durch eigenen Button minimieren Allgemeine Java-Themen 6
Zrebna Testkonzept erstellen - Verständnisschwierigkeiten Allgemeine Java-Themen 6
dokan wie kann ich eine funktionierende Suchleiste erstellen Allgemeine Java-Themen 1
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
berserkerdq2 SceneBuilder GUI erstellt, nun muss ich noch ein Polygon erstellen, ist die Connection möglich? Allgemeine Java-Themen 3
berserkerdq2 Was heißt es mit FXML Listener zu setzen ind Buttons zu erstellen? Allgemeine Java-Themen 6
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
D Open Source Library zum erstellen von PDFs Allgemeine Java-Themen 1
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
J Power Point erstellen inklusive Diagramm Allgemeine Java-Themen 12
F IDEA IntelliJ Java Songliste erstellen Allgemeine Java-Themen 6
N Tree erstellen Allgemeine Java-Themen 8
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
berserkerdq2 Kann keine Labels erstellen, was ist hier syntaktisch falsch Allgemeine Java-Themen 5
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
A Trace-Tabelle erstellen Allgemeine Java-Themen 3
M Excel Datei Erstellen Allgemeine Java-Themen 2
OnDemand Erstellen von Quartz Jobs pro Aufgabe oder zusammenfassen Allgemeine Java-Themen 7
H Matrix ohne Array erstellen Allgemeine Java-Themen 9
R Geometry erstellen die abhängig von Variablen ist Allgemeine Java-Themen 6
Gaudimagspam Skip Liste erstellen in Java Allgemeine Java-Themen 3
Avalon DTO aus mehrere Entitäten erstellen Allgemeine Java-Themen 5
Kirby.exe Distanz Map für die Distanztransformation erstellen Allgemeine Java-Themen 1
Avalon Data Transfer Objekte aus Datenbank erstellen Allgemeine Java-Themen 8
M Registry Autostart Eintrag mit Java erstellen (über Windows cmd) Allgemeine Java-Themen 7
B .txt Datei erstellen und auslesen bzw. schreiben Allgemeine Java-Themen 6
M Java 2D Array für ein Grid erstellen ? Allgemeine Java-Themen 2
B Datei/Ordner auf Server zugreifen/erstellen Allgemeine Java-Themen 2
T Objekt mit String und Int aus TxT Datei erstellen Allgemeine Java-Themen 23
M Rectangle mit Java erstellen? Allgemeine Java-Themen 9
G Fläche erstellen mit Entfernungen Allgemeine Java-Themen 1
T Multithreading: Wie viele Threads sollte ich erstellen? Allgemeine Java-Themen 12
B Rangliste erstellen Allgemeine Java-Themen 13
D 2,3-Baum rekursiv erstellen Allgemeine Java-Themen 20
D Datentypen 2-3 Baum erstellen mit geordnetem int-array Allgemeine Java-Themen 0
L SQL Datei in Eclipse erstellen Allgemeine Java-Themen 3
J Datenstruktur für eine Map erstellen Allgemeine Java-Themen 2
J File in Package erstellen & lesen mit Programmstart in externe Projekt Allgemeine Java-Themen 3
E Erstellen einer Liste mit einer maximalen Menge an Elementen Allgemeine Java-Themen 13
E Ts3API Subchannel erstellen und rein moven !! Allgemeine Java-Themen 0
J Eigene Api erstellen und dann auch verwenden - Ordnerstruktur Allgemeine Java-Themen 1
S GetMethode erstellen mit Hilfe von Parametern Allgemeine Java-Themen 9
T 2D-Grafik Chart als Image erstellen Allgemeine Java-Themen 3
I Fehler beim Ant-Package erstellen mit Java 9 Allgemeine Java-Themen 1
N Bei Mouse Events nicht mehrere Objekte erstellen Allgemeine Java-Themen 13
S Compiler-Fehler IntelliJ Projektdatei lässt sich nicht erstellen. Allgemeine Java-Themen 15
M 2D Array mit unterschiedlichen Längen erstellen und befüllen Allgemeine Java-Themen 11
E Swing Buttons auf knopfdruck(anderer Button) erstellen Allgemeine Java-Themen 6
S TestNG Eclipse: Reporting erstellen/ verändern Allgemeine Java-Themen 0
F .jar erstellen und starten Allgemeine Java-Themen 15
M Array aus Thread Objekten erstellen Allgemeine Java-Themen 2
N 1000 MQTT Messages die Sekunde - 1000 Threads erstellen ? Allgemeine Java-Themen 10
Tommy Nightmare Klassen Globale Klassen erstellen Allgemeine Java-Themen 7
K Datei (CSV-ähnlich) in Java einlesen & mit teil der Daten Graphen erstellen Allgemeine Java-Themen 9
S Maven Jars dynamisch laden / Plugin-Struktur erstellen Allgemeine Java-Themen 14
T 32-Bit Applikationen mit Eclipse erstellen Allgemeine Java-Themen 4
R Input/Output RTF erstellen? Allgemeine Java-Themen 2
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
S Klassen Klassen "virtuell" erstellen Allgemeine Java-Themen 5
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
M Dokument erstellen Allgemeine Java-Themen 0
S Java API für GitHub erstellen Allgemeine Java-Themen 14
T Ant Jar Datei per Ant in Eclipse erstellen Allgemeine Java-Themen 2
4a61766120617274697374 Hintergrundjobs(tasks) in Java erstellen Allgemeine Java-Themen 3
K Eigene API erstellen? Allgemeine Java-Themen 13
N Benutzeroberfläche erstellen Allgemeine Java-Themen 5
Thallius Eigenes Message Center erstellen Allgemeine Java-Themen 3
perlenfischer1984 Mehrere Komponenten erstellen Allgemeine Java-Themen 3
B jni - Headerdatei erstellen Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben