将char与char数组进行比较?

时间:2014-11-13 15:50:44

标签: java arrays

    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参数的副本,但没有任何元音

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

此代码存在三个大问题。

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

首先,您无法在equals上使用char,因为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的新值,它从不查看元音{{1} }。

解决该问题的几种方法是:

  • 如果您从中移除某个字符,请确保'i'不会增加(您可以使用i取消i--};

  • 向后搜索索引(即以i++开头并递减)而不是转发。

(通过使用s.length()-1方法或replaceAll,还有其他方法可以解决这个问题,但我假设这是一个类,你的目的是学习循环的基础知识和这样。)

答案 2 :(得分:0)

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

读取:匹配所有未被跟随的元音([aeiou])((?!...))和#34;字尾#34; (\ b)中。有关更多信息,请阅读java.util.regex.Pattern;

上的Javadoc

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

String.replaceAll("[aeiou]\\B", "");