簡體   English   中英

將char與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM