Genutzte Methoden in einen Frame einbauen

Bitte aktiviere JavaScript!
Liebe JAVA-Freunde,

ich bin neu in dem Metier, möchte mich aber wirklich sehr gerne in JAVA weiter fortbilden.

Ich hatte mir eine simple Aufgabe überlegt "Buchstaben zählen und verschieden große Buchstabenfolgen miteinander vergleichen". Dazu nutze ich einen "main String s" und drei verschiedene Teilstrings (s. im JAVA Code).

Könnt' Ihr mir vielleicht weiterhelfen?

1. Ich verstehe z.B. nicht, wieso "s.lastindexOf(?)" nicht funktioniert; ich würde sehr gerne die Platzierung des letzten Buchstabens vom Teilstring ausgeben lassen, aber es funktioniert einfach nicht (es gibt immer die Error-Meldung, dass das Symbol "s" nicht gefunden werden konnte, aber "s" habe ich doch definiert? Um das zu umgehen, nutze ich jetzt "s.indexOf(?) + ?.length()" um den Schluss herauszubekommen - aber hier wird doch auch "s" genutzt - ich hoffe, Ihr könnt mir weiterhelfen.

2. Gibt es eine Möglichkeit, um die Teilstrings mit der Buchstabenfolge "s" abzugleichen?
Also nicht nur "true" oder "false", sondern auch Teilergebnisse, wie "s" ist mit "X" zu xx%
identisch unter Angabe bis wohin bzw. ob ein/zwei/x Buchstaben verschieden sind:
Quasi wie ein Alignment.

In etwa so: s1= AAABBABBBBCCCCTTTT // X= AAAA
-> X ist mit s identisch von 1-3 mit Prozentangabe

3. Im Meshlab funktioniert der angegebene Code, es wäre jedoch wünschenswert alle Aufgaben in einem Frame darzustellen.

In etwa so:

1. Fenster: "Geben Sie die Buchstabenfolge ein" - OK
2. Abgleich mit diversen (vorgegebenen) Folgen
-> X = AAAA/Y=BBB/Z=TTC - drei oder mehr Buttons, um den Vergleich auszuführen
3. Ergebnis mit allen angegebenen Vorgaben (Länge der genutzten
Buchstabenfolge "s", Länge der einzelnen Folgen, Beginn und Ende der Folge
in "s", 100% fit = "true"-Angabe und ansonsten zu wie viel Prozent unter der
Angabe der identischen Buchstabenfolge, Substitution des Teilstrings im Main String mit dem neuen Zeichen wie "X")

Ich hoffe, ich habe es einigermaßen verständlich schreiben können ;) und freue mich auf Eure Hilfe und Anregungen!

Noch zum Code:
1. // ich füge Absätze ein, um mehr Überblick nach dem Compilieren zu haben
2. // bei "s.indexOf(X)+1)" habe ich (+1) angegeben, damit die Suche nicht bei 0 startet.

Vielen Dank und viele Grüße

Chris

Java:
public class Buchstaben {
public static void main(String[] args){
System.out.println();
System.out.print("Genutzte Buchstaben: AAAABBBBCCCTTTTC " );
System.out.println();
System.out.println();
String s="AAAABBBBCCCTTTTC";
System.out.print("Wie viele Buchstaben sind vorhanden? ");
System.out.println(s.length());
System.out.println();
System.out.print("Sind nachfolgende Buchstabenkombinationen vorhanden? ");
System.out.println();
System.out.println();
System.out.print("Ist X = (AAAA) vorhanden? ");
System.out.println(s.contains("AAAA"));
String X="AAAA";
System.out.print("Wie viele Buchstaben sind in X? ");
System.out.println(X.length());
System.out.print("Wo beginnt X in der genutzten Folge?__Bei: ");
System.out.println(s.indexOf(X)+1);
System.out.print("Wo endet X in der genutzten Folge?__Bei: ");
System.out.println(s.indexOf(X)+ (X.length()));
System.out.println();
System.out.print("Ist Y =(CCC) vorhanden? ");
System.out.println(s.contains("CCC"));
String Y= "CCC";
System.out.print("Wie viele Buchstaben sind in Y? ");
System.out.println(Y.length());
System.out.print("Wo beginnt Y in der genutzten Folge?__Bei: ");
System.out.println(s.indexOf(Y)+1);
System.out.print("Wo endet Y in der genutzten Folge?__Bei: ");
System.out.println(s.indexOf(Y)+ (Y.length()));
System.out.println();
System.out.print("Ist Z (TCT) vorhanden? ");
System.out.println(s.contains("TCT"));
String Z="TCT";
System.out.print("Wie viele Buchstaben sind in Z? ");
System.out.println(Z.length());
System.out.print("Wo beginnt Z in der genutzten Folge?__Bei: ");
System.out.println(s.indexOf(Z)+1);
System.out.print("Wo endet Z in der genutzten Folge?__Bei: ");
System.out.println(s.indexOf(Z)+ (Z.length()));
System.out.println();
System.out.print("MATCH-UP WITH X : " );
System.out.println(s.replace("AAA", "####X####--"));
System.out.print("MATCH-UP WITH Y : " );
System.out.println(s.replace("CCC", "####H2####--"));
System.out.print("MATCH-UP WITH Z : " );
System.out.println(s.replace("TCT", "####H3####--"));
}
}
 
A

Anzeige




Vielleicht hilft dir unser Java-Tutorial hier weiter —> (hier klicken)
Hallo Chris,

da ich auch Neuling bin, erst einmal nur eine Antwort zu 1.) - Ich konnte das in meiner Umgebung ohne Probleme testen:

Java:
public class Buchstaben {

    public static void main(String[] args) {

        System.out.println();
        System.out.print("Genutzte Buchstaben: AAAABBBBCCCTTTTC ");
        System.out.println();
        System.out.println();
        String s = "AAAABBBBCCCTTTTC";
        System.out.print("Wie viele Buchstaben sind vorhanden? ");
        System.out.println(s.length());
        System.out.println();
        System.out.print("Sind nachfolgende Buchstabenkombinationen vorhanden? ");
        System.out.println();
        System.out.println();
        System.out.print("Ist X = (AAAA) vorhanden? ");
        System.out.println(s.contains("AAAA"));
        String X = "AAAA";
        System.out.print("Wie viele Buchstaben sind in X? ");
        System.out.println(X.length());
        System.out.print("Wo beginnt X in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(X) + 1);
        System.out.print("Wo endet X in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(X) + (X.length()));
        String XX = "A";
        System.out.println("RalfB: Wo endet X in der genutzten Folge?__Bei: " +s.lastIndexOf(XX));
        System.out.println();
        System.out.print("Ist Y =(CCC) vorhanden? ");
        System.out.println(s.contains("CCC"));
        String Y = "CCC";
        System.out.print("Wie viele Buchstaben sind in Y? ");
        System.out.println(Y.length());
        System.out.print("Wo beginnt Y in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(Y) + 1);
        System.out.print("Wo endet Y in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(Y) + (Y.length()));
        System.out.println();
        System.out.print("Ist Z (TCT) vorhanden? ");
        System.out.println(s.contains("TCT"));
        String Z = "TCT";
        System.out.print("Wie viele Buchstaben sind in Z? ");
        System.out.println(Z.length());
        System.out.print("Wo beginnt Z in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(Z) + 1);
        System.out.print("Wo endet Z in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(Z) + (Z.length()));
        System.out.println();
        System.out.print("MATCH-UP WITH X : ");
        System.out.println(s.replace("AAA", "####X####--"));
        System.out.print("MATCH-UP WITH Y : ");
        System.out.println(s.replace("CCC", "####H2####--"));
        System.out.print("MATCH-UP WITH Z : ");
        System.out.println(s.replace("TCT", "####H3####--"));

    }

}
Hier die dazugehörige Ausgabe:

Code:
Genutzte Buchstaben: AAAABBBBCCCTTTTC

Wie viele Buchstaben sind vorhanden? 16

Sind nachfolgende Buchstabenkombinationen vorhanden?

Ist X = (AAAA) vorhanden? true
Wie viele Buchstaben sind in X? 4
Wo beginnt X in der genutzten Folge?__Bei: 1
Wo endet X in der genutzten Folge?__Bei: 4
RalfB: Wo endet X in der genutzten Folge?__Bei: 3

Ist Y =(CCC) vorhanden? true
Wie viele Buchstaben sind in Y? 3
Wo beginnt Y in der genutzten Folge?__Bei: 9
Wo endet Y in der genutzten Folge?__Bei: 11

Ist Z (TCT) vorhanden? false
Wie viele Buchstaben sind in Z? 3
Wo beginnt Z in der genutzten Folge?__Bei: 0
Wo endet Z in der genutzten Folge?__Bei: 2

MATCH-UP WITH X : ####X####--ABBBBCCCTTTTC
MATCH-UP WITH Y : AAAABBBB####H2####--TTTTC
MATCH-UP WITH Z : AAAABBBBCCCTTTTC
Wie Du an der Zeile

RalfB: Wo endet X in der genutzten Folge?__Bei: 3
siehst funktioniert es wie erwartet... ich kann hier kein problem feststellen.

Ich habe Java 8 und Eclipse als IDE.

Gruß

Ralf
 
Hallo Ralf,
vielen Dank für Deine schnelle Rückmeldung.
Wenn ich Deinen Code eingebe funktioniert es auch bei mir.
Bei der Eingabe bei Zeile 23-25 ergibt sich trotzdem folgender Fehler:

"BS.java:25: error: cannot find symbol
System.out.println(s.lastindexOf(XX));
^
symbol: method lastindexOf(String)
location: variable s of type String
1 error"

Verstehe ich irgendwie nicht...
Woran könnte das liegen?

VG

Chris


Java:
public class BS {

    public static void main(String[] args) {

        System.out.println();
        System.out.print("Genutzte Buchstaben: AAAABBBBCCCTTTTC ");
        System.out.println();
        System.out.println();
        String s = "AAAABBBBCCCTTTTC";
        System.out.print("Wie viele Buchstaben sind vorhanden? ");
        System.out.println(s.length());
        System.out.println();
        System.out.print("Sind nachfolgende Buchstabenkombinationen vorhanden? ");
        System.out.println();
        System.out.println();
        System.out.print("Ist X = (AAAA) vorhanden? ");
        System.out.println(s.contains("AAAA"));
        String X = "AAAA";
        System.out.print("Wie viele Buchstaben sind in X? ");
        System.out.println(X.length());
        System.out.print("Wo beginnt X in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(X) + 1);
        System.out.print("Wo endet X in der genutzten Folge?__Bei: ");
        String XX ="AAAA";
        System.out.println(s.lastindexOf(XX));
        System.out.println();
        System.out.print("Ist Y =(CCC) vorhanden? ");
        System.out.println(s.contains("CCC"));
        String Y = "CCC";
        System.out.print("Wie viele Buchstaben sind in Y? ");
        System.out.println(Y.length());
        System.out.print("Wo beginnt Y in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(Y) + 1);
        System.out.print("Wo endet Y in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(Y) + (Y.length()));
        System.out.println();
        System.out.print("Ist Z (TCT) vorhanden? ");
        System.out.println(s.contains("TCT"));
        String Z = "TCT";
        System.out.print("Wie viele Buchstaben sind in Z? ");
        System.out.println(Z.length());
        System.out.print("Wo beginnt Z in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(Z) + 1);
        System.out.print("Wo endet Z in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(Z) + (Z.length()));
        System.out.println();
        System.out.print("MATCH-UP WITH X : ");
        System.out.println(s.replace("AAA", "####X####--"));
        System.out.print("MATCH-UP WITH Y : ");
        System.out.println(s.replace("CCC", "####H2####--"));
        System.out.print("MATCH-UP WITH Z : ");
        System.out.println(s.replace("TCT", "####H3####--"));

    }

}
 
Danke!! Jetzt kann ich es zumindest compilieren, aber es wird mir dennoch der falsche Wert angegeben.

"Ist X = (AAAA) vorhanden? true
Wie viele Buchstaben sind in X? 4
Wo beginnt X in der genutzten Folge?__Bei: 1
Wo endet X in der genutzten Folge?__Bei: 0
--> müsste ja aber 4 lauten..."

VG
 
Zuletzt bearbeitet:
a.lastIndexOf(b) gibt den Index des letzten Vorkommens der Zeichenfolge b in a zurück (oder -1, falls b überhaupt nicht in a vorkommt).

Wo beginnt "AAA" in der Zeichenfolge "AAA"? Richtig, bei Index 0, daher bekommt ihr auch 0 ausgegeben.

Quizfrage: wie müsste man also lastIndexOf richtig verwenden?
 
Ja, aber ich suche ja nicht den Anfang von X, sondern das Ende. Mit "s.lastIndexOf(X)" suche ich doch das letzte Vorkommen von X im Main String "s". Wenn ich also nach "AAAA" suche und diese Folge kommt in "s" an Stelle 4 das letzte mal vor, stimmt doch die Überlegung, oder?
Bitte aufklären - vielen Dank!

VG
 
Wenn ich also nach "AAAA" suche und diese Folge kommt in "s" an Stelle 4 das letzte mal vor, stimmt doch die Überlegung, oder?
Nein. Wenn s="AAAABBBBCCCTTTTC", dann kommt "AAAA" das einzige (und damit auch das letzte) mal an Stelle 0 vor.

Wäre s="AAAABAAAACDEF", dann wäre s.lastIndexOf("AAAA") == 5, dann das erste mal kommt es an Stelle 0 vor, das zweite (und letzte) mal an Stelle 5.
 
Hallo mihe7,
danke für die Aufklärung! Weill ich "AAAA" als Ganzes betrachten muss, kommt es logischerweise auch nur am Index 0 vor - ok, verstanden. Danke! Aber wie kann ich es dann am besten machen, dass mir der letzte Buchstabe von X ausgegeben wird?

@ Robat: Eigentlich war das als ernst gemeinte Frage gedacht und nicht als "Lachnummer". Schade - eine Hilfe Deinerseits wäre sicherlich hilfreicher gewesen ;)
 
@JAVA-Neuling17 Es war auch eine ernst gemeinte Antwort. Wenn du das Ende des letzten Vorkommens haben möchtest, musst du dir einen eigenen Algorithmus einfallen lassen und diesen implementieren. Mit lastIndexOf wirst du da nicht weit kommen - siehe Antwort von @mihe7 .. Und das es eine gute Übung ist, ist auch ernst gemeint.
 
2) klingt ein bisschen nach LCS-Problem .. und danach einfach die Länge der LCS mit der Länge des Patterns (zB: "AAAA" ) vergleichen .. dann kannst du ja den Prozentsatz bestimmen
3) Würde ich erstmal hinten anstellen. Wenn dein Programm richtig modelliert ist, ist es am Ende egal, ob die Ausgabe auf der Konsole oder einer GUI passiert. Setz dich erstmal an dem Algorithmus und die Ausgabe kann später immer noch "verschönert" werden
 
1) s.lastIndexOf(X) + X.length(); natürlich nur, wenn s.lastIndexOf(X) >= 0 ist.
2) 3) s. Antwort von @Robat

Nachtrag: wenn Du den Index des letzten Buchstabens von X haben willst, musst Du natürlich noch 1 abziehen.
 
Hallo nochmal!
Also ich habe mich mal kundig gemacht und bzgl. LCS-Problem und Prozentangabe informiert.
Habe hier jetzt zwei Programmcodes; einmal zur Wiedergabe der identischen Buchstaben (allerdings ergibt sich hieraus nur die Anzahl der gleichen Buchstaben und nicht die Länge der Folge "X", bis zum ersten Fehler in "s"...)

z.B.
s = AAABBBB X= AACB --> Ergebnis: AAB (gleich Anzahl an Buchstaben) und nicht AA (Match bis zum 1. Fehler)

und einmal zur Berechnung der Identität in Prozent.

Hierzu muss ich die zu untersuchende Sequenz alleridngs immer eingeben. Könnt' Ihr mir helfen, wie ich beide Methoden in einem Code verbinde und meine gegebenen Sequenzen miteinbinden kann?

Ich freue mich auf eure Rückmeldungen und Ratschläge!

Viele Grüße

Hier die drei Codes:

Code BS:
Java:
public class BS {
    public static void main(String[] args) {
        System.out.println();
        System.out.print("Genutzte Buchstaben: AAAABBBBCCCTTTTC ");
        System.out.println();
        System.out.println();
        String s = "AAAABBBBCCCTTTTC";
        System.out.print("Wie viele Buchstaben sind vorhanden? ");
        System.out.println(s.length());
        System.out.println();
        System.out.print("Sind nachfolgende Buchstabenkombinationen vorhanden? ");
        System.out.println();
        System.out.println();
        System.out.print("Ist X = (AAAA) vorhanden? ");
        System.out.println(s.contains("AAAA"));
        String X = "AAAA";
        System.out.print("Wie viele Buchstaben sind in X? ");
        System.out.println(X.length());
        System.out.print("Wo beginnt X in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(X) + 1);
        System.out.print("Wo endet X in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(X) + X.length());
        System.out.println();  
        System.out.print("Ist Y =(CCC) vorhanden? ");
        System.out.println(s.contains("CCC"));
        String Y = "CCC";
        System.out.print("Wie viele Buchstaben sind in Y? ");
        System.out.println(Y.length());
        System.out.print("Wo beginnt Y in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(Y) + 1);
        System.out.print("Wo endet Y in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(Y) + Y.length());
        System.out.println();
        System.out.print("Ist Z (TCT) vorhanden? ");
        System.out.println(s.contains("TCT"));
        String Z = "TCT";
        System.out.print("Wie viele Buchstaben sind in Z? ");
        System.out.println(Z.length());
        System.out.print("Wo beginnt Z in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(Z) + 1);
        System.out.print("Wo endet Z in der genutzten Folge?__Bei: ");
        System.out.println(s.indexOf(Z)+Z.length());
        System.out.println();
        System.out.print("MATCH-UP WITH X : ");
        System.out.println(s.replace("AAA", "####X####--"));
        System.out.print("MATCH-UP WITH Y : ");
        System.out.println(s.replace("CCC", "####H2####--"));
        System.out.print("MATCH-UP WITH Z : ");
        System.out.println(s.replace("TCT", "####H3####--"));
    }
}
Code Buchstabenwiedergabe (lcs2):

Java:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class  lcs2{
      public String lcs(String str1, String str2){
        int l1 = str1.length();
        int l2 = str2.length();
        int[][] arr = new int[l1 + 1][l2 + 1];
        for (int i = l1 - 1; i >= 0; i--)
        {for (int j = l2 - 1; j >= 0; j--)
            {if (str1.charAt(i) == str2.charAt(j))
                 arr[i][j] = arr[i + 1][j + 1] + 1;
                  else arr[i][j] = Math.max(arr[i + 1][j], arr[i][j + 1]);
            }
        }
        int i = 0, j = 0;
        StringBuffer sb = new StringBuffer();
        while (i < l1 && j < l2)
        {
            if (str1.charAt(i) == str2.charAt(j))
            {
                sb.append(str1.charAt(i));
                i++;
                j++;
            }
            else if (arr[i + 1][j] >= arr[i][j + 1])
                i++;
            else
                j++;
        }
        return sb.toString();
    }
        public static void main(String[] args) throws IOException{  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Test auf Identität der Buchstabenfolgen miteinander\n");
        System.out.println("\nFolge 1");
        String str1 = br.readLine();
        System.out.println("\nFolge 2");
        String str2 = br.readLine();
        lcs2 obj = new lcs2();
        String result = obj.lcs(str1, str2);
        System.out.println("\nErgebnis : "+ result);
    }
}
Code Prozentangabe (lcs_prozent):

Java:
public class lcs_prozent {
  public static double similarity(String s1, String s2) {
    String longer = s1, shorter = s2;
    if (s1.length() < s2.length()) {
      longer = s2; shorter = s1;
    }
    int longerLength = longer.length();
    if (longerLength == 0) { return 1.0; /* both strings are zero length */ }
    return (longerLength - editDistance(longer, shorter)) / (double) longerLength;
  }
  public static int editDistance(String s1, String s2) {
    s1 = s1.toLowerCase();
    s2 = s2.toLowerCase();
    int[] costs = new int[s2.length() + 1];
    for (int i = 0; i <= s1.length(); i++) {
      int lastValue = i;
      for (int j = 0; j <= s2.length(); j++) {
        if (i == 0)
          costs[j] = j;
        else {
          if (j > 0) {
            int newValue = costs[j - 1];
            if (s1.charAt(i - 1) != s2.charAt(j - 1))
              newValue = Math.min(Math.min(newValue, lastValue),
                  costs[j]) + 1;
            costs[j - 1] = lastValue;
            lastValue = newValue;
          }
        }
      }
      if (i > 0)
        costs[s2.length()] = lastValue;
    }
    return costs[s2.length()];
  }
  public static void printSimilarity(String s, String t) {
    System.out.println(String.format(
      "%.3f Prozent sind identisch bei \"%s\" and \"%s\"", similarity(s, t), s, t));
  }
  public static void main(String[] args) {
    printSimilarity("AAABBBB", "AACB");
    }
    }
 
Hallo mihe7,
komme leider erst jetzt wieder zum Schreiben.

Mein Hauptproblem: Ich komme leider irgendwie nicht weiter, wie ich am besten meinen Main String "s" und meine gesuchten Buchstabenfolgen (X,Y,Z) in die beiden genannten Codes einbringen kann bzw. die beiden Codes in mein ursprüngliches Programm miteinbinde...also, dass ich nicht erst zwei Vergleichssequenzen eingeben muss, sondern das Programm autonom meine Beispiele berechnet und mir die Identität bzw. auch die vorkommenden Buchstaben mitteilt.

Dann: [...] wie man in zwei Zeichenketten die Anzahl der ersten gleichen Buchstaben ermittelt?[...]

Genau, das ist dann ein weiteres Problem. Wie kann ich es eindeutig vermerken, dass er mir die Identität und die max. Buchstabenfolge meines Teilstrings wiedergibt? Im jetzigen Zustand bestimmt er ja nur die vorkommenden Buchstaben und matched diese mit dem Vergleich, jedoch gibt dies ja nicht den eigentlichen Sinn wieder. Ich möchte ja eben wissen, wann die zu vergleichende Sequenz im Main String abbricht bzw. von wo bis wo die längste Buchstabenfolge vorkommt...

Kannst Du mir da weiterhelfen?

Zudem wäre es auch schön, wenn man das, dann fertige, genutzte Programm (auch wenn nur sehr simpel) mit einer GUI darstellen könnte, man also nicht erst die Seuquenzen und Folgen im Programm Code eintragen und compilieren muss, sondern ein eigenständiges Prigramm hat, in welches Genanntes eingegeben und mir mit Buttons und co. die Ergebnisse veranschaulicht werden. Hättest Du hier auch paar Anregungen für mich bzw. vielleicht sogar einen Beispiel Frame o.d.G., den ich erweitern kann?

Vielen Dank und viele Grüße.
 
A

Anzeige




Hier lernst du alle wichtigen Java-Grundlagen.
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben