2013-01-07 62 views
-1

我使用下面的代碼來添加一個猜測的輔音到一串恆星,如果猜測的輔音是原始單詞的一部分。最初,我在撥打getCurrentResult的電話之間保留wordWithGuess。但結果是新內容被添加到最後,並且wordWithGuess不斷變長(而不是僅僅取代最近猜到的字母)。猜測方法(非常基本的java)

當運行下面的代碼,輸出是

 
After guessing r: *****r****** 
After guessing s: ************ 
After guessing t: **tt******** 
After guessing l: ********ll** 
After guessing n: ***********n 

我的目標是爲它是:

 
After guessing r: *****r****** 
After guessing s: *****r****** 
After guessing t: **tt*r****** 
After guessing l: **tt*r**ll** 
After guessing n: **tt*r**ll*n 

示例代碼如下:

public class Sample { 
    String targetWord; 
    String wordWithGuess = ""; 

    public Sample(String targetWord) { 
     this.targetWord = targetWord; 
    } 

    public void guess(String consonant) { 
     wordWithGuess = ""; 

     for (int i = 0; i < targetWord.length(); i++) { 
      if (targetWord.substring(i, i + 1).equals(" ")) { 
       wordWithGuess += " "; 
      } else if (targetWord.substring(i, i + 1).equals(consonant)) { 
       wordWithGuess += consonant; 
      } else { 
       wordWithGuess += "*"; 
      } 
     } 
    } 

    public String getCurrentResult() { 
     return wordWithGuess; 
    } 

    public static void main(String args[]) { 
     String targetWord = "bitterbollen"; 

     Sample sample = new Sample(targetWord); 

     String[] guesses = { "r", "s", "t", "l", "n" }; 

     for (String guess : guesses) { 
      sample.guess(guess); 
      System.out.println("After guessing " + guess + ": " 
        + sample.getCurrentResult()); 
     } 
    } 
} 
+0

爲什麼我會陷入低谷,我做錯了什麼? – Jente

+0

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

+0

有人曾將此鏈接與我聯繫過,但我不太明白。你可能會聯繫我一個例子嗎?謝謝 – Jente

回答

1

的問題是,您需要在撥打guess()的電話之間保留一些信息。這意味着要麼存儲consonant的所有值,要麼找到合併舊值wordWithGuess和新輔音的方法。

第一個選項是指像

import java.util.Set; 
import java.util.HashSet; 

class Sample { 

    // ... 

    Set<String> guesses = new HashSet<String>(); 

    public void guess(String consonant) { 
     guesses.add(consonant); 

     wordWithGuess = ""; 

     for (int i = 0; i < targetWord.length(); i++) { 
      String cursor = targetWord.substring(i, i + 1); 

      if (cursor.equals(" ")) { 
       wordWithGuess += " "; 
      } else if (guesses.contains(cursor)) { 
       wordWithGuess += cursor; 
      } else { 
       wordWithGuess += "*"; 
      } 
     } 
    } 

    // ... 

} 

它保存舊的猜測爲Setguess()現在包含任何已被猜測的字母,而不僅僅是檢查最後的猜測。

事實上,你甚至可以添加一個構造函數來初始化包含默認包含的任何字符的集合。這將讓你消除對空間的檢查,因爲它會在最初設定的猜測:

import java.util.Set; 
import java.util.HashSet; 

class Sample { 

    // ... 

    Set<String> guesses; 

    public Sample() { 
     this.guesses = new HashSet<String>(); 
     guesses.add(" "); 
    } 

    public void guess(String consonant) { 
     guesses.add(consonant); 

     wordWithGuess = ""; 

     for (int i = 0; i < targetWord.length(); i++) { 
      String cursor = targetWord.substring(i, i + 1); 

      if (guesses.contains(cursor)) { 
       wordWithGuess += cursor; 
      } else { 
       wordWithGuess += "*"; 
      } 
     } 
    } 

    // ... 

} 

另一種選擇,是更新wordWithGuess以包括新的猜測。在C中很容易做到這一點,因爲字符串可以像字符數組一樣被修改(例如,wordWithGuess[i] = consonant。Java更嚴密地保護它的字符串,但沒有理由不能使用同一個效果的char數組。

public class Sample { 
    String targetWord; 
    char[] currentResult; 

    public Sample(String targetWord) { 
     this.targetWord = targetWord; 
     currentResult = new char[targetWord.length()]; 
     for (int i = 0; i < targetWord.length(); i++) { 
      if(targetWord.charAt(i) == ' ') { 
       currentResult[i] = ' '; 
      } else { 
       currentResult[i] = '*'; 
      } 
     } 
    } 

    public void guess(String consonant) { 
     for (int i = 0; i < targetWord.length(); i++) { 
      String cursor = targetWord.substring(i, i + 1); 

      if (cursor.equals(consonant)) { 
       currentResult[i] = consonant.charAt(0); 
      } 
     } 
    } 

    public String getCurrentResult() { 
     return new String(currentResult); 
    } 

    // ... 

} 
+0

所以我改變了這一點,現在它不再添加它,這是好的,但現在它忘記了第二次輔助猜測時的第一個輔音猜測。謝謝 – Jente

+0

我正在研究類似你的第三種選擇,但無法完成它的工作。謝謝! – Jente

0

你想存儲上一次迭代的結果讓代碼oldWordWithGuess = wordWithGuess在的結束for循環

然後,在你的循環,你會希望下面的代碼:。

... 
if(oldWordWithGuess[i] != `*`) { 
    wordWithGuess += oldWordWithGuess[i]; 
} else if (word.substring(i, i + 1).equals (" ")) { 
... 

那wa Ÿ就會把以前的任何猜測英寸

1

你應該存儲所有輔音猜到了,並改變 word.substring(i, i + 1).equals (consonant)

喜歡的東西

word.substring(i, i + 1) exists in the consonant guessed.(這是當然的pusedo代碼)

一些更多提示:查看Set(或更確切地說,HashSet)或String的contains()或indexOf()方法。


一些額外的意見,您:

您呼叫word.substring(I,I + 1),而不存儲返回的字符串,這是一個毫無意義的電話。

多次調用word.substring(i,i + 1),您可以調用它一次,並使用返回的字符串進行多重比較。

而且,由於每次比較一個字符,應該使用char來存儲該字符,並使用charAt()來獲取該字符在某個位置。

0

我實際上已經找到了一個不同的解決方案,我使用char數組並將每個字母存儲在該數組的不同元素中。我真的允許這樣做嗎?這不需要太多的資源來完成它的功能嗎?