Vererbung Static Scanner Objekt verwenden - von StdIn in einer importierten Klasse lesen

Harald123

Mitglied
Guten Tag,

ich habe ein Projekt erstellt worin ich eine .jar Bibliothek importiert habe. Daraus möchte ich eine Klasse namens "Count" verwenden/ausführen.
Die Count enthält eine Zeile:

while (StdIn.hasNextChar()) {..}

wo die Ausführung meines Projektes stehen bleibt.

In der main Methode meiner Klasse wird ein String[] Objekt als Argument für die main Methode der Count Klasse weitergegeben. Es wird auch ein Scanner Objekt erstellt und initialisiert. Anschließend wird die main Methode von Count aufgerufen:

String[] a = new String[2];
a[0]="AB";
a[1]="AABBB";

Scanner StdIn;
StdIn = new Scanner("AABBB");

Count.main(a);


Falls diese Info benötigt wird: die Count Klasse kann nicht instantiiert werden.

Also die Frage ist wie kann das StdIn Scanner Objekt, welches in meiner Klasse erstellt wird, von der Count Klasse erkannt werden?

Ich habe, nach den Anweisungen aus den unteren Ressourcen, mit

public static Scanner StdIn

versucht, aber die Count Klasse erkennt das Objekt leider nicht. Die Count Klasse kann auch nicht bearbeitet werden, sonst hätte ich etwas wie MeineKlasse.StdIn in der Count Klasse verwenden können.

https://stackoverflow.com/questions/4646577/global-variables-in-java

https://stackoverflow.com/questions...bal-variable-without-closing-scan-constantly#

Vielen Dank!
 
Ich würde niemanden empfehlen die main-Methode einer Klasse aus einer anderen aufzurufen. Erstelle für dein Vorhaben eine eigene Methode in Count und übergib den Scanner dieser Methode.
 
Das wäre tatsächlich eine Lösung, aber leider kann Count nicht bearbeitet werden, da sie in der im Projekt eingeschlossenen .jar enthalten ist.. Oder gibt es dafür einen Umgehungsweg?
 
vielen Dank für die Antwort. Ich habe weiter versucht und kann sagen, dass es eigentlich an meinem Unwissen liegt die Klasse aus der jar auszuführen als die Bibliothek. Die Bibliothek wurde von erfahrenen Entwicklern geschrieben: https://algs4.cs.princeton.edu/code/


Ich habe Schritt für Schritt verfolgt was passiert und habe festgestellt, dass die Zeile "while (StdIn.hasNextChar()) {..}" aus Count die Methode hasNextChar aus einer in der gleichen .jar enthaltenen Klasse StdIn aufruft, welche dann weiter die Methode readInput() aus der Klasse Scanner aufruft . Bei dieser Zeile aus der Mthode readInput()
try { n = source.read(buf); } wird
public int read(java.nio.CharBuffer cb) throws IOException;
aus der public Interface Readable aufgerufen.

Bei diesem Schritt bleibt die Ausführung stehen , jedoch ohne Fehler, es sieht nach einer endlosen Schleife aus. Unten rechts im NetBeans steht 'running' - siehe Screenshot.

Die Frage ist also wie die Count Klasse ausgeführt werden kann - ich habe es über diesen Weg versucht, welcher wie oben beschrieben hängen bleibt (Aufruf über Count.main() ergibt Fehler ) :

package algs;
import edu.princeton.cs.algs4.Count;

public class Algs {

public static void main(String[] args) {
String[] a = new String[2];
a[0]="AB";
Count.main(a);
}
}


Wenn jemand Zeit hätte sich das anzuschauen, wäre ich dankbar.
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    1,1 KB · Aufrufe: 29
Es wird von der Standardeingabe gelesen. Wenn dabei von der Tastatur gelesen wird, gibt es im Normalfall kein Ende (EOF). Daher "beendet" das Programm auch nicht.

Unter Windows könntest Du Strg+Z als EOF-Marker probieren. Ob das innerhalb von NetBeans funktioniert, kann ich Dir nicht sagen. Startest Du das Programm über die Eingabeaufforderung, sollte Strg+Z passen. Unter Linux wäre es Strg+D.

Ansonsten kannst Du in der Eingabeaufforderung die Standardeingabe umleiten, so wie es im Header von Count.java angegeben ist:

java Count alpha < input.txt
 
Vielen Dank!

Folgendes habe ich erreichen können:
Umleitung der Standardeingabe funktioniert.

java -cp algs4.jar edu.princeton.cs.algs4.Count AB
AABBB
^Z
A 2
B 3

In Netbeans funktioniert das leider nicht, habe das gleiche eingegeben mit Strg+Z Tastenkombination und explizit Zeichen in das Output Fesnter eingetragen - es passiert nichts und bleibt beim 'running':
AA
AABB
^Z

Da suche ich weiter. Vielen Dank nochmal für die schnelle Hilfe 🙂
 
Wieso schreibst Du Dir die Klasse nicht einfach neu?

Java:
import edu.princeton.cs.algs4.Alphabet;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.UncheckedIOException;

public class CharCount {
    private final Alphabet alphabet;

    public CharCount(Alphabet alphabet) {
        this.alphabet = alphabet;
    }

    public int[] of(Reader reader) throws IOException {
        int[] count = new int[alphabet.radix()];
        int ch;
        while ((ch = reader.read()) != -1) {
            if (alphabet.contains((char) ch)) {
                count[alphabet.toIndex((char) ch)]++;
            }
        }
        return count;
    }

    public int[] of(String inp) {
        try {
            return of(new StringReader(inp));
        } catch (IOException ex) {
            throw new UncheckedIOException(ex);
        }
    }
}

Beispiel:
Java:
public static void main(String[] args) {
    Alphabet a = new Alphabet("AB");
    CharCount count = new CharCount(a);
    int[] result = count.of("AABBB");
    for (int i = 0; i < result.length; i++) {
        System.out.println(a.toChar(i) + " " + result[i]);
    }
}
 
kann ich auch machen ja. Aber ich habe diese Klasse verwendet um deren Aufruf zum laufen zu bringen. (Habe inzwischen entdeckt, dass es mit Klasse Average noch einfacher ist). Mein Ziel ist es anhand diesen Erkenntnissen die anderen Klassen aus dem .jar auszuführen um so Algorithmen zu lernen.

Zum Thema EOF - ich habe, nach dem was ich gelesen habe, vor es mit einer anderen IDE zu testen, was scheinbar funktionieren sollte. Unter NetBeans 8.2 ist es auch nicht möglich "Console Type = External Terminal und External Terminal Type = Command Window" zu setzen, obwohl es laut einer Seite in dieser Version diese Möglichkeit geben sollte.
 
Mein Ziel ist es anhand diesen Erkenntnissen die anderen Klassen aus dem .jar auszuführen um so Algorithmen zu lernen.
Algorithmen lernt man nicht, indem man sie nur anwendet. Versuch doch einfach mal, die Algorithmen zu verstehen und sie dann selbst umzusetzen.

Objektiv muss man einfach sagen, dass eine Lib, die die Daten nur von der Standardeingabe entgegennimmt, keine gute Idee ist.
 
Ich habe auch mit JDeveloper versucht, da verhält es sich gleich wie in NetBeans. Gibt es eine IDE, dass einen EOF marker akzeptiert, oder worin das Windows cmd als Konsole eingestellt werden kann?
 

Zurück
Oben