Array ermitteln - in Quellcode speichern

VTechMS

Mitglied
Mal angenommen, ich habe zwei Dateien.

Wenn die Datei 1 ausgeführt wird, so werden Werte im Array abc gespeichert.

Dann möchte ich diesen vollgepackten Array in den Quellcode von Datei 2 speichern.

Wie könnte man das machen?


Bsp.:

Datei 1: Beim Ausführen werden dem Array abc die natürlichen Zahlen von 1 bis 1000 zugewiesen.

Datei 2: Array abc hat schon vor dem Kompilieren die Werte erhalten

Quellcode Datei 2
...
int[] abc=hier sind alle natürlichen Zahlen von 1 bis 1000 drin;
...
 
Geht es dir hier wirklich um Codegeneration oder darum Daten von einem Programm zu einem anderen zu übertragen?

Der einzige Anwendungsfall für dein Beispiel welcher mir einfällt wäre zuerst ein Konfigurationstool zu starten, diese irgendwo abzulegen und damit ein 2. Programm auszuführen.

Da würde sich allerdings entweder eine properties-datei oder eine gemeinsame Datenbank anbieten, in welche die erste Anwendung die Daten einträgt und die 2. sie wieder ausließt.

Soll die 2. Anwendung von der 1. gestartet werden bieten sich vielleicht Aufrufparameter an, die per ProcessBuilder verwendet werden und im 2. Programm aus den args wieder ausgelesen werden.

Gruß
 
Was genau passieren soll, ist, dass einmalig eine Kolone von Zahlen ausgelesen wird, die dann in Arrays gespeichert wird.

Z.B. in einem Text-Dokument stehen viele Zahlen aneinandergereiht: Java liest aus:

123123123123123123123 und packt das in Array 1. Ich definiere, dass die Zahlenkette für Fußball steht.

3434345693 in Array 2, steht für: Basketball
8989898989999999 in Array 3, steht für: Tennisball

Diese Zahlenkolonen ändern sich nie wieder - 123123123123123123123 steht immer für Fußball.


Datei 2:

Die möchte ich dann als feste Werte in den Quellcode von Datei 2 bekommen - wenn möglich, ohne alles abzutippen.

Datei zwei ruft ein Zahlenkolone in einer anderen Textdatei auf

77892378942738942739423984723897489237489237491231231231231231231234534534534543434345693949494

und soll einfach überprüfen, ob der komplette Block von Array 1 und/oder Array 2 usw. in der Zahlenkette enthalten ist.

Hier wird dann erkannt, dass der Zahlencode für Fußball und Basketball enthalten ist.
 
Und warum macht Datei 2 das nicht direkt wie Datei 1, speichert diese Werte intern und sucht im Text? Oder meinst du "Datei" als Synonym für "Klasse"?

Dir mag der Prozess einleuchten, mir/uns ist der noch nicht so klar.
 
Klingt für mich, als sollte hier einfach ein String-Matching durchgeführt werden (zwischen verschiedenen Dateien).

Vielleicht ist es einfacher wenn du uns erstmal die Problemstellung erklärst.
Soweit wie ich es bis jetzt verstanden habe bekommst du eine Textdatei mit Zahlen, du kannst davon Teilabschnitte mit einem Begriff verbinden und anschließend in einer 2. Textdatei nach diesen Abschnitten suchen.

Das wäre eine Problemstellung die man ohne Probleme mit einem einzigen Programm lösen kann (erst Datei einlesen, dann Semantik definieren, anschließend 2. Datei einlesen und nach den definierten Abschnitten suchen).

Gruß
 
Datei zwei ruft ein Zahlenkolone in einer anderen Textdatei auf

77892378942738942739423984723897489237489237491231231231231231231234534534534543434345693949494

und soll einfach überprüfen, ob der komplette Block von Array 1 und/oder Array 2 usw. in der Zahlenkette enthalten ist.

Hier wird dann erkannt, dass der Zahlencode für Fußball und Basketball enthalten ist.
Ich sehe keine Trennzeichen zwischen den Zahlen. Wie wird den ausgeschlossen, dass Überlappungen oder zufällige Treffer in den scheinbar eingebetteten Datenteilen erkannt werden?

bye
TT
 
Normalerweise vermeidet man in Java, den Quellcode zu verändern. Du kannst natürlich auch zur Laufzeit den Compiler in tools.jar anwerfen, aber ich vermute mal, das ist mit Kanonen auf Spatzen...

Was genau ist das Problem? Warum soll Klasse2 nicht einfach das Array irgendwo auslesen und gut ist?
 
Vorallem, wenn Programm 1 das Array erstellt/generiert, könnte das in Programm 2 ebenso geschehen.
 
Ich möchte Wörter auf einer grafischen Oberfläche erkennen.

Das mit der Zahlenkette sollte nur ein Beispiel sein, um das Problem in der Nussschale darzustellen.

Als Anfäger in Java habe ich folgendes zusammengesucht.

Die Pixel jedes Buchstabens werden ausgelesen und in einem Array gespeichert.

Das ist meine Vorlage
http://www.alphabetglobal.com/img/english-alphabet.gif

- das später auszulesene Bild enthält genau die gleichen Buchstaben, die, um es mal zu vereinfachen, genau aus den gleichen Pixeln bestehen, nur dass im auszulesenen Bild nicht A B C D steht, sondern AFFE, ESEL, ELEFANT.


Dann speichere ich die einzelnen Pixel-Werte für A in einem Array. (der Vorgang wird für alle Buchstaben wiederholt)

Java:
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;
import java.io.File;
import java.io.IOException;
import java.awt.Color;
 
import javax.imageio.ImageIO;
 
public class ABC {
 
  public static void main(String[] args) {
 
    Robot robot = null;
    try {
      robot = new Robot();
    }
    catch (AWTException e) {
      e.printStackTrace();
    }

     

     BufferedImage buchstabeA = robot.createScreenCapture(new Rectangle(1, 1, 40, 45));
    try {
      ImageIO.write(buchstabeA, "png", new File("./screenshotA.png"));
// um zu sehen, ob der richtige Bereich makiert ist

      analyze(buchstabeA);
    }
    catch (IOException e) {
      e.printStackTrace();
    }

     }

     
private static void analyze(BufferedImage bufferedImage) {
        int width = bufferedImage.getWidth(null);
        int height = bufferedImage.getHeight(null);
        int[] pixels = new int[width * height];
        bufferedImage.getRGB(0, 0, width, height, pixels, 0, width);
 
        for (int i = 0; i < pixels.length; i++) {
            int rgb = pixels[i];
            System.out.println(new Color(rgb));
        }
    }
}

im Array wurde dann z.B. Folgendes gespeichert


Java:
java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=206,g=206,b=206]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=208,g=208,b=208]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=207,g=207,b=207]

java.awt.Color[r=208,g=208,b=208]


--------------------------------------------------------------

Später hat man wieder ein Bild wie oben -

http://www.alphabetglobal.com/img/english-alphabet.gif

- nur dass da dann AFFE, ESEL, ELEFANT steht und das erkannt werden soll.

Java:
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;
import java.io.File;
import java.io.IOException;
import java.awt.Color;
 
import javax.imageio.ImageIO;
 
public class WortErkennen {
 
  public static void main(String[] args) {
 
    int[] buchstabeA = hier sind alle Werte - r=208,g=208,b=208 - gespeichert;

    Robot robot = null;
    try {
      robot = new Robot();
    }
    catch (AWTException e) {
      e.printStackTrace();
    }

     

     BufferedImage wort = robot.createScreenCapture(new Rectangle(1, 1, 300, 45));
    try {
      ImageIO.write(wort, "png", new File("./screenshotWort.png"));


      analyze(wort);
    }
    catch (IOException e) {
      e.printStackTrace();
    }

     }

     
private static void analyze(BufferedImage bufferedImage) {
        int width = bufferedImage.getWidth(null);
        int height = bufferedImage.getHeight(null);
        int[] pixels = new int[width * height];
        bufferedImage.getRGB(0, 0, width, height, pixels, 0, width);
 
        for (int i = 0; i < pixels.length; i++) {
            int rgb = pixels[i];
            System.out.println(new Color(rgb));
        }

-- und dann noch in einer anderen Methode die Werte von pixels[] und buchstabeA[] abgleichen-- 
    }
}

Das hier soll nur ein erster Ansatz sein. Es wird hier noch hinten und vorne klemmen.

Wie könnte man die ABC Arrays in die zweite Klasse bekommen?
 
Zuletzt bearbeitet:
Indem du aus den Buchstaben Objekte machst, diese serialisierbar und du diese dann speicherst. Jetzt kann jedes Java-Programm aus den serialisierten Buchstaben-Objekten wieder Java-Objekte erzeugen. Könnte das klappen?
 
Ich möchte Wörter auf einer grafischen Oberfläche erkennen.
Was ist diese graphische Oberfläche? Ein anderer Teil Deiner Anwendung, ein anderes Programm (in einer anderen Programmiersprache geschrieben)?

[...]Die Pixel jedes Buchstabens werden ausgelesen und in einem Array gespeichert.
Du willst also eine OCR (Buchstabenerkennung) programmieren? Dann solltest Du mal mit den Typen Java OCR | Free software downloads at SourceForge.net reden, damit du weißt, was auf Dich zu kommt...

[...]- das später auszulesene Bild enthält genau die gleichen Buchstaben, die, um es mal zu vereinfachen, genau aus den gleichen Pixeln bestehen, [...]
Wie willst Du das sicher stellen? Wenn die Quelle tatsächlich eine andere Anwendung ist kann die dort verwendete Schriftart von der Betriebssystem-Version und den Vorlieben des Anwenders abhängen...

[...]im Array wurde dann z.B. Folgendes gespeichert
Java:
java.awt.Color[r=207,g=207,b=207]
java.awt.Color[r=208,g=208,b=208]
...
Was passiert, wenn die andere Anwendung andere Farben nutzt?


Später hat man wieder ein Bild wie oben -[...]
- nur dass da dann AFFE, ESEL, ELEFANT steht und das erkannt werden soll.
Wie könnte man die ABC Arrays in die zweite Klasse bekommen?
Prinzipiell kannst Du die Muster entweder als Globale Variable bereitstellen oder als Parameter weiterreichen. Ich sehe hier keine Notwendigkeit irgendeinen Quellcode anzupassen.

Ich denke, dass Weitergeben der Muster ist eigentlich der leichtere Teil. Der Rest Deiner geplanten Anwendung überzeugt mich noch nicht...

bye
TT
 
Das alles soll das Programm nicht können, Timothy.

Es soll mein erster Gehversuch werden in dem Bereich Buchstabenerkennen, daher werden auch immer die gleichen Farben verwendet für die Buchstaben.

Hier klemmt es ja schon hinten und vorne bei mir, aber wenn das realisiert sein sollte, dann denke ich erst darn, etwas Größeres zu probieren, so dass deine Punkte Anwendung finden müssen.

Jetzt bin ich mir aber immer noch unsicher, wie ich einen vollen Array rüber bringen kann.
 
Es soll mein erster Gehversuch werden in dem Bereich Buchstabenerkennen, daher werden auch immer die gleichen Farben verwendet für die Buchstaben.
OK, Du willst also das Rad zum zweiten mal erfinden. Von mir aus... ;o)

Jetzt bin ich mir aber immer noch unsicher, wie ich einen vollen Array rüber bringen kann.
Du weist Was Rückgabewerte und Parameter sind?

Dann ändere den Rückgabertyp von
Code:
analyze
in Zeile 39 der Klasse ABC zu
Code:
int[]
und gib am Ende der Methode
Code:
pixels
zurück. In
Code:
ABC.main
speicherst du diesen Rückgabewert in einer neuen (localen) Variable. Dass machst Du auch in der Klasse
Code:
WortErkennen
. Gib den
Code:
analyze
-Methoden und den Variablen in den
Code:
main
-Methoden verschiedene Namen.
Dann Kopierst Du die umbenannte
Code:
analyze
-Methode aus ABC in die Klasse
Code:
WortErkennen
und den Inhalt von
Code:
ABC.main
an den Anfang von
Code:
WortErkennen.main
.
Schon hast Du beide Arrays in der Hand und kannst damit arbeiten.

bye
TT
 
Dankeschön.


Sehe ich das richtig?

Die Werte in Klammern bedeuten folgendes:

Java:
 bufferedImage.getRGB(0, 0, width, height, pixels, 0, [B]width[/B]);

Es werden die Pixel ausgelesen.

Gestartet wird bei Pixel 0,0,
- ausgelesen werden alle Pixel für die entsprechenden Werte für width und height
- die Werte werden in einem Array Names pixels gespeichert
- es wird angefangen bei der 0.ten Komponente

- aber für was steht das letzte width?
 
Die Werte in Klammern bedeuten folgendes:
Java:
 bufferedImage.getRGB(0, 0, width, height, pixels, 0, [B]width[/B]);
Es werden die Pixel ausgelesen.

Gestartet wird bei Pixel 0,0,
- ausgelesen werden alle Pixel für die entsprechenden Werte für width und height
- die Werte werden in einem Array Names pixels gespeichert
- es wird angefangen bei der 0.ten Komponente

- aber für was steht das letzte width?
[TIPP]Nach meiner Erfahrung hilft ein Blick in die API überdurchschnittlich oft weiter[/TIPP]
BufferedImage; hat gesagt.:
http://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html#getRGB(int,%20int,%20int,%20int,%20int[],%20int,%20int)
getRGB
Code:
public int[] getRGB(int startX,
           int startY,
           int w,
           int h,
           int[] rgbArray,
           int offset,
           int scansize)

Returns an array of integer pixels in the default RGB color model (TYPE_INT_ARGB) and default sRGB color space, from a portion of the image data. Color conversion takes place if the default model does not match the image ColorModel. There are only 8-bits of precision for each color component in the returned data when using this method. With a specified coordinate (x, y) in the image, the ARGB pixel can be accessed in this way:

Code:
 pixel   = rgbArray[offset + (y-startY)*scansize + (x-startX)];

An ArrayOutOfBoundsException may be thrown if the region is not in bounds. However, explicit bounds checking is not guaranteed.

Parameters:
startX - the starting X coordinate
startY - the starting Y coordinate
w - width of region
h - height of region
rgbArray - if not null, the rgb pixels are written here
offset - offset into the rgbArray
scansize - scanline stride for the rgbArray
​
Returns:
array of RGB pixels.​
 

Neue Themen


Zurück
Oben