有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将一个字符与一个字符数组进行比较?

    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);
  }
}

这项工作是替换一个单词中的所有元音,如何使用元音数组替换每个元音

问题是:编写一个返回字符串的方法,该字符串是字符串参数的副本,但不包含任何元音


共 (3) 个答案

  1. # 1 楼答案

    String.replaceAll("[aeiou](?!\\b)", "");
    

    阅读:匹配所有未跟随((?!…)的元音([aeiou])通过“词尾”(\b)。有关更多信息,请阅读java.util.regex.Pattern;上的Javadoc

    更简单的是这个(等效但更简单的)正则表达式:

    String.replaceAll("[aeiou]\\B", "");
    
  2. # 2 楼答案

    根据你问题的精神,你可以编写一个新函数来检查数组是否包含字符:

    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;
    }
    
  3. # 3 楼答案

    这段代码有三大问题

    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 来抵消i++

    • 向后遍历索引(即以s.length()-1和减量开头),而不是向前

    (还有其他方法可以解决这个问题,通过使用replaceAll方法或Set<Character>,但我假设这是一个类,您的目的是学习循环等的基础知识。)