2016-06-04 6 views
0

Ich habe ein Projekt, das nach dem Zufallsprinzip 2 Buchstaben (E und R) produzieren wird. Wenn es 3 Buchstaben von R gibt, stoppt das Programm und druckt die letzte zufällige Zeichenfolge und "Es gibt 3 Rs!"Wie zu sehen, wenn es 3 aufeinanderfolgende (in einer Reihe) Rs in meinem Programm gibt?

konnte ich die for-Schleife machen, usw. Aber, es ist ein Fehler, zu sagen, „String-Index außerhalb des Bereichs“. Ich kann keine Leerzeichen in die Zeichenfolge einfügen, wenn ich sie zum ersten Mal deklariere (mein Lehrer möchte das inline mit der Ausgabe haben). Danke für die Hilfe. Hier

ist, was ich habe:

public static void main(String[] args) { 
    String eOrR = ""; 
    for(int i = 0; i < 2147483647; i++){ 
     int random = (int) (Math.random() * 2 + 1); 
     if (random == 2){ 
      eOrR += "E"; 
     }else{ 
      eOrR += "R"; 
     } 

     if(eOrR.charAt(i) == 'R' && eOrR.charAt(i+1) == 'R' && eOrR.charAt(i+2) == 'R'){ 
      System.out.println(eOrR + "\nThree R's in a row!"); 
      break; 
     } 

    } 
} 
+1

warum nicht Ihre Lehrer fragen? –

+1

Nein, weil sie es nicht beantworten wird. Meine Freunde wissen auch nicht, wie es geht. – FusionPointInc

Antwort

1

Ich denke, ein schöner Weg, um Ihre Logik zu handhaben ist, einen Zähler für zu halten, wie viele R Briefe, die Sie gesehen haben. Dieser Zähler wird jedes Mal um eins erhöht werden, ein R zu sehen ist, und wird beim Anblick ein E auf Null zurückgesetzt werden:

public static void main(String[] args) { 
    String eOrR = ""; 
    int counter = 0; 

    for (int i=0; i < 2147483647; i++) { 
     int random = (int) (Math.random() * 2 + 1); 

     if (random == 2) { 
      eOrR += "E"; 
      counter = 0; 
     } else { 
      eOrR += "R"; 
      ++counter; 
     } 

     if (counter >= 3) { 
      System.out.println(eOrR + "\nThree R's in a row!"); 
      break; 
     } 
    } 
} 
+0

Das funktioniert! Vielen Dank! – FusionPointInc

+0

Um dies noch effizienter zu machen, könnten Sie die zweite 'if' Anweisung in den 'else' Block schreiben.Es sollte auch ein ['StringBuilder'] (https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html) verwendet werden, da die Verkettung in einer Schleife langsam ist. – 4castle

+0

@ 4castle Ich werde diese Änderung nicht machen, aber eine Änderung, die es wert wäre, wäre 'StringBuilder' statt' String'. Ich vermute jedoch, dass dies für das ursprüngliche Problem nicht in Betracht kommt. –

0

Dies liegt daran, das erste Mal, wenn die Schleife läuft,

if(eOrR.charAt(i) == 'R' && eOrR.charAt(i+1) == 'R' && eOrR.charAt(i+2) == 'R'){ 
    System.out.println(eOrR + "\nThree R's in a row!"); 
    break; 
} 

der obige Code aufgerufen wird, und es wird nicht einmal 3 Zeichen zu überprüfen, weil Sie haben nur einen hinzugefügt, der E oder R ist. Um dies zu beheben, rufen Sie den obigen Code nach Überprüfung, ob string.lenght() mindestens 3 Zeichen ist.

+1

Okay. Ich werde es versuchen! Vielen Dank! -Edit: Ich bekomme immer noch einen Out-of-Bound-Fehler: – FusionPointInc

+0

Es muss auch "i-1" und "i-2" sein. Wenn "i" das letzte Zeichen in der Zeichenfolge darstellt, muss es die dahinter liegenden Zeichen überprüfen. – 4castle

+0

Ok. Ich werde das versuchen. Aber ich bekomme immer noch einen Fehler außerhalb der Grenzen. 'If ​​(eOrR.length()> = 3) { if (eOrR.charAt (i-1) == 'R' && eOrR.charAt (i) == 'R' && eOrR.charAt (i + 1) == 'R') { System.out.println (eOrr + "\ nDrei R's in einer Reihe!"); Pause; } } '@ 4castle – FusionPointInc

-1

= Werfen Sie einen Blick auf Ihre zweite, wenn bedingten Block.

Nun zahlen die Einrichtung Ihres Parameter besondere Aufmerksamkeit. Ich empfehle, ein Stück Papier zu nehmen und ein Array von 4 Zeichen zu erstellen (z. B. [W, W, R, R]).

Führen Sie das Array mit Ihrem 2. if-Bedingungsblock durch und vergewissern Sie sich, dass die '& &'-Subroutinen auf der' if'-Routine aufbauen.

Wenn Sie bemerken, Ihre println Funktion wird nicht einmal aufgerufen.

+0

Ich habe diese Methode nie wirklich benutzt. Aber ich werde es versuchen! – FusionPointInc

0

das Verfahren der Verwendung String#indexOf, und übergibt als Parameter die Zeichenkette gefunden werden (in diesem Fall RRR); wenn diese nicht gefunden wird zurückkehren das Verfahren eine ganze Zahl (-1)

Beispiel:

if(eOrR.indexOf("RRR")!=-1) { 
    System.out.println(eOrR + "\nThree R's in a row!"); 
} 
+0

Das ist wirklich ineffizient. Es muss nur die letzten 3 Zeichen in der Zeichenfolge anzeigen. Dies würde eine O (1) -Operation zu O (n) – 4castle

+0

machen. Ich habe diese Methode nie wirklich benutzt. Aber ich werde es versuchen! Danke für Ihre Hilfe! – FusionPointInc

Verwandte Themen