2016-11-03 35 views
0

我不會撒謊,這是我的AP計算機科學課的作業。但是我和我的老師談過了,他也弄不明白。爲什麼我的Codingbat String-2 EndOther的代碼不工作?

所以我在做Java CodingBat問題String-2 endOther here,我不知道爲什麼我的代碼無法正常工作。

挑戰的目標是確定一個字符串是否出現在另一個字符串的最後。如果是,則返回true,否則返回false。例如:如果字符串是「Hiabc」和「abc」,它將返回true,但由於「bc」不是結尾,所以「Hiabcx」和「bc」將返回false。 注:案例無關緊要。

我的代碼適用於除「其他測試」之外的所有運行示例。我可能已經能夠弄清楚如何解決它,除了我不知道它運行的是什麼「其他測試」。那麼對此有何幫助?這裏是我的代碼:

public boolean endOther(String a, String b) { 
    a = a.toLowerCase(); 
    b = b.toLowerCase(); 
    if (a.contains(b) && a.indexOf(b) == a.length() - b.length()) { 
     return true; 
    } else if (b.contains(a) && b.indexOf(a) == b.length() - a.length()) { 
     return true; 
    } else { 
     return false; 
    } 
} 

謝謝!

+0

兩件事。首先,如果您沒有失敗的測試用例,我不確定您認爲我們可以如何幫助您。其次,爲什麼不在你的String上使用'endsWith'方法? –

+0

@JoeC:你可以在CodingBat上自己運行測試;這個測試在一個不知名的「其他」盒子中失敗了,這個盒子可能會令人沮喪地發現。 – Makoto

+0

我正在考慮沿着「邊緣案例」的路線;即如果您的輸入爲空或空白,會發生什麼情況,但問題並未指定該行爲。 – Makoto

回答

0

我知道了這個問題的答案已經發布,但至於你原來的代碼去,我想我有什麼地方出了錯的想法。 如果其中一個「其他測試」使用了諸如「abc」之類的字符串,並且與具有多次出現「abc」的字符串比如「Hiabcabc」進行比較,那麼即使「abc」是在「Hiabcabc」的末尾。 發生這種情況的原因是indexOf()查找第一個發生該參數並返回它的索引。這會導致包含超過一個較小字符串的測試中的錯誤否定。

使用substring()可能是解決這個問題的最佳解決方案,因爲它可以讓你在字符串的結尾特意去找,但是如果你想修改你的代碼儘可能少,你可以使用lastIndexOf()作爲替代indexOf()。這會導致你的代碼通過了所有的測試。

這是你修改後的代碼:

public boolean endOther(String a, String b) { 
    a = a.toLowerCase(); 
    b = b.toLowerCase(); 
    if (a.contains(b) && a.lastIndexOf(b) == a.length() - b.length()) { 
    return true; 
    } else if (b.contains(a) && b.lastIndexOf(a) == b.length() - a.length()) { 
    return true; 
    } else { 
    return false; 
    } 
} 

而這裏的甲骨文文檔頁面上indexOf()如果你想要做一些更多閱讀:http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#indexOf(java.lang.String)

+0

我意識到'indexOf()'返回第一個找到的索引,我只是忘記了他們可能已經將相同的字符串放在另一個字符串中兩次。但是,我不知道'lastIndexOf()'存在,所以我嘗試了它,它工作。 – RoboticPlayer

0

我的直覺是他們希望你使用substring。原因很簡單:只要它位於該字符串的最終位置上,那麼這個模式在哪個字符串中都會出現並不重要。

你也不應該(在實踐中)操縱你傳入的參數,因爲這可能會讓你在以後出錯。將final添加到您的參數列表將阻止您這樣做,以防萬一您不小心認爲它正在做某件事情。

最後,您不需要將兩個字符串都轉換爲小寫字母;有一種方法叫做equalsIgnoreCase,對於這種情況,其工作原理就好了

爲了解決這個問題,我抽出了一個不同的方法來完成主要的比較。主要方法中的邏輯只確定哪個字符串在哪裏(因爲較長的字符串可能在右邊)。以下是我的解決方案,其中通過全部的測試。

public boolean endOther(final String a, final String b) { 
    if (a.length() >= b.length()) { 
     return endOtherHelper(a, b); 
    } else { 
     return endOtherHelper(b, a); 
    } 
} 

private boolean endOtherHelper(final String longStr, final String shortStr) { 
    return longStr.substring(longStr.length() - shortStr.length()).equalsIgnoreCase(shortStr); 
} 
+0

我沒有使用'equalsIgnoreCase'方法的原因是因爲我實際上沒有檢查任何字符串相等。再次,這個解決方案確實有效(再次涉及到使用'String.endsWith'方法),但是你知道我的代碼爲什麼沒有嗎?就我個人而言,我寧願向我解釋爲什麼我寫的東西不起作用,以及如何解決問題,而不是給予替代解決方案。如果我找不到原因,最終可能會使用'endsWith'方法,但理想情況下我只想修復當前的代碼。 – RoboticPlayer

+0

@RoboticPlayer:這可能就是這樣。我發現你的代碼除了像變異你的參數那樣的特定的代碼外沒有任何問題,但是實際的測試可能來自於檢查你對方法的使用或者你對'String'方法調用的次數。實際上,你的代碼可能沒問題,而CodingBat使用的測試有點奇怪。我不會在這裏讀到太多的內容,但是我所編寫的解決方案無論如何都是一個簡單的方法,只要您能夠正確地切入它。 – Makoto

0

看看這段代碼,也許你會明白的錯誤:

public boolean endOther(String a, String b) { 
    if(a.length() < b.length()) 
    return b.toLowerCase().substring(b.length()-a.length()).equals(a.toLowerCase()); 
    else 
    return a.toLowerCase().substring(a.length()-b.length()).equals(b.toLowerCase()); 
} 
+0

歡迎來到Stack Overflow!儘管您可能已經解決了此用戶的問題,但僅有代碼的答案對於未來出現此問題的用戶來說並不是很有幫助。請編輯您的答案,以解釋爲什麼您的代碼可以解決原始問題。 –