【问题标题】:Only printing words with certain characters in a string仅打印字符串中具有某些字符的单词
【发布时间】:2020-05-14 20:28:11
【问题描述】:

这是我的代码。如果用户的输入是“Avery is into Naval Aviation”,那么我需要它只打印出带有“av”的单词。我在这里错过了什么?

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    while (true) {

        String user = scanner.nextLine();


        if (user.equals("")) {
            break;
        }

        String[] cut = user.split(" ");
        for (int i = 0; i < cut.length; i++) {
            if (user.contains("av")) {
                System.out.println(cut[i]);
            }


        }

    }
}

期望的输出:

艾弗里 海军 航空

【问题讨论】:

  • 试试cut[i].contains("av")
  • ...和user.toLowerCase().split(" ")
  • 只是一个建议 - 使用增强的 for 循环

标签: java string for-loop split


【解决方案1】:

你的代码有两个问题:

  1. 您正在检查user 是否包含av,而您需要检查cut[i]
  2. 您正在检查小写的av,因此您需要检查小写的av cut[i]

解决方案:

替换

user.contains("av")

cut[i].toLowerCase().contains("av")

或者,您可以拆分小写的user,然后将av 搜索到结果数组中,即

String[] cut = user.toLowerCase().split(" ");

然后,你可以使用

cut[i].contains("av")

【讨论】:

    【解决方案2】:
    1. 您在循环中引用了user 参数,而不是您要搜索的word
    2. 也可能存在大写/小写不匹配。
    3. 您可能还需要根据正则表达式进行拆分,而不仅仅是空格。

      public static void main(String[] args) { 扫描仪scanner = new Scanner(System.in);

      while (true) {
      
          String user = scanner.nextLine();
      
      
          if (user.equals("")) {
              break;
          }
      
          String[] words = user.toLowerCase().split("\\s+");
          for (int i = 0; i < words.length; i++) {
              if (words[i].contains("av")) {
                  System.out.println(cut[i]);
              }
      
      
          }
      
      }
      

    【讨论】:

      【解决方案3】:

      您在标记的行中使用了错误的变量:

      public static void main( String[] args ) 
      {
          Scanner scanner = new Scanner( System.in );
      
          while( true ) 
          {
              String user = scanner.nextLine();
      
              if( user.equals( "" ) ) break;
      
              String[] cut = user.toLowerCase().split( " " );
              for( int i = 0; i < cut.length; ++i ) 
              {
                  if( cut [i].contains( "av" ) ) /* originally: user.contains(…) */ 
                  {
                      System.out.println( cut[i] );
                  }
              }
          }
      }
      

      这就是The fourth bird 他们评论的意思。

      如果需要,对String.toLowerCase() 的调用确保也可以找到“Avery”和“Aviation”(我的假设和Andreas' 的假设 - 见评论)。

      您当然可以使用增强的 for 循环,甚至是 Stream,但这或多或少是个人喜好问题。

      【讨论】:

        【解决方案4】:

        坚持使用String.split 的想法,你会做这样的事情:

        String test = "Avery is into Naval Aviation";
        
        for(String word : test.split(" "))
            if(word.toLowerCase().contains("av"))
                System.out.println(word);
        

        但是,另一个要考虑的选择是使用regular expression 进行匹配:

        Pattern p = Pattern.compile("[a-z]*av[a-z]*", Pattern.CASE_INSENSITIVE);
        for(Matcher m = p.matcher(test); m.find();)
            System.out.println(m.group());
        

        输出:

        Avery
        Naval
        Aviation
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-22
          • 2019-06-28
          • 1970-01-01
          相关资源
          最近更新 更多