[英]I have a two dimensional array of chars and for some reason it will not let me compare a char inside the array to another char?
[英]Compare a char to an array of chars?
package loopPractice;
import java.util.Scanner;
public class replaceVowels {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
System.out.print("Enter a string: ");
String s = sc.nextLine();
String originalString = s;
char[] vowels = {'a', 'e', 'i', 'o', 'u'};
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c.equals(vowels[i])){
String front = s.substring(0, i);
String back = s.substring(i + 1);
s = front + "" + back;
}
}
System.out.println(originalString);
System.out.println(s);
}
}
工作是替換單詞中的所有元音,如何使用元音數組替換每個元音?
問題是:編寫一個返回String的方法,該String是String參數的副本,但沒有任何元音
那么,根據你的問題的精神,你可以編寫一個新函數來檢查一個數組是否包含一個字符:
public static void main(String[] args) {
System.out.print("Enter a string: ");
String s = sc.nextLine();
String originalString = s;
char[] vowels = {'a', 'e', 'i', 'o', 'u'};
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (contains(c, vowels)) {
String front = s.substring(0, i);
String back = s.substring(i + 1);
s = front + "" + back;
}
}
System.out.println(originalString);
System.out.println(s);
}
private static boolean contains(char c, char[] arr) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == c) {
return true;
}
}
return false;
}
這段代碼有三個大問題。
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c.equals(vowels[i])){
String front = s.substring(0, i);
String back = s.substring(i + 1);
s = front + "" + back;
}
}
首先,您不能在char
上使用equals
,因為char
是基本類型。 使用==
。
其次,你沒有正確檢查元音。 上面的代碼比較了's'的第0個字符和元音數組中的第0個字符; 也就是說,它將它與'a'
進行比較,但不與任何其他元音進行比較。 類似地,它將索引1處的字符與'e'
進行比較,但不將任何其他元音,2至'i'
等字符進行比較; 當你到達索引5時,程序將拋出異常,因為vowels
不是那么大。
解決方案是你需要一個雙循環 (或嵌套循環)。 對於s
每個字符,您需要針對vowels
數組中的每個字符進行檢查(或者至少在您匹配之前)。 所以你需要類似的東西
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
boolean isAVowel = false;
for (int j = 0; j < vowels.length; j++) {
if (c == vowels[j]) {
isAVowel = true;
break; // will leave the inner loop but not the outer loop
}
// I'll let you finish the rest
正如@cptcactus在他的回答中所展示的那樣,將內循環移動到新方法是實現這種解決方案的好方法。
第三個問題更微妙。 當您循環遍歷數組或字符串中的索引,並且循環從數組或字符串中刪除元素時,您必須非常小心,因為索引將會移位。 假設您的代碼大致如此:
for (int i = 0; i < s.length(); i++) {
if [[[ s.charAt(i) is a vowel ]]] {
[[[ remove the i'th character from s; ]]]
}
}
說s
是"air"
。 首先i
設置為0, s.charAt(i)
是'a'
。 這是一個元音,所以我們刪除它。 這意味着s
現在是"ir"
。 然后我們循環回來並將i
設置為1.現在s.charAt(i)
是'r'
因為它使用s
的新值,它從不看元音'i'
。
解決該問題的幾種方法是:
如果你從中刪除一個字符,請確保i
沒有增加(你可以使用i--
這將取消i++
);
向后穿過索引(即以s.length()-1
並遞減)而不是向前。
(還有其他方法可以通過使用replaceAll
方法或Set<Character>
來解決這個問題,但我假設這是一個類,你的目的是學習循環的基礎等等。)
String.replaceAll("[aeiou](?!\\b)", "");
讀取:將未跟隨的所有元音([aeiou])((?!...))與“詞尾”(\\ b)匹配。 有關更多信息,請閱讀java.util.regex.Pattern;
上的Javadoc java.util.regex.Pattern;
更簡單的是這個(相當但更簡單)的正則表達式:
String.replaceAll("[aeiou]\\B", "");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.