字符串数组大小和用于访问元素的 for 循环

Posted

技术标签:

【中文标题】字符串数组大小和用于访问元素的 for 循环【英文标题】:String array size and for loop to access element 【发布时间】:2019-01-26 11:37:19 【问题描述】:

所以这是一个与问题有关的问题。在 codechef (https://www.codechef.com/problems/FRK) 上。我不知道为什么我需要将字符串数组的大小增加 1 并运行循环小于等于(

  int nooffriends=0;
  Pattern p = Pattern.compile("[^A-Za-z0-9.]");
  Scanner scan = new Scanner(System.in);
  int noofUsers=scan.nextInt();

  if(noofUsers<1||noofUsers>5000)
      return;
  String array[]=new String[noofUsers+1];  //need to increase this size to get correct answer
  for(int i=0;i<=noofUsers;i++)     //had to put '<=' instead '<'(why)
      array[i]=scan.nextLine();

//    if(array[i].charAt(0)<89||array[i].charAt(0)>122)
//      return;
      Matcher m = p.matcher(array[i]);

      if (m.find())
        break;
      if(array[i].contains("ch")||array[i].contains("he")||array[i].contains("ef"))
      nooffriends++;
  
  System.out.print(nooffriends);

【问题讨论】:

为什么还需要一个数组?如果只是对当前元素进行操作 这是一个很好的解决方案。我不需要那个数组。谢谢。但即使我想知道增加大小的原因.. 它的大小没有增加。正如我在答案中写的那样 nextInt() 没有读取换行符。这就是为什么在您的循环中,第一个 nextLine() 从上一次调用 nextInt() 中读取新行。只需在循环之前添加一个额外的 nextLine() 就可以了 或者总是使用 nextline() 然后解析为 int 【参考方案1】:

问题在于,当您扫描 nextInt() 时,您并没有终止该行。所以下一次调用 nextLine() 实际上会读取输入的同一行。如果您检查数组的内容,您将看到 [0] 元素为空。此外,如果您在循环中打印 i,您将看到它允许您在第一个元素上输入,而第 0 个元素被跳过。

为了修复它,在你的 nextInt() 之后添加一个 scan.nextLine() 它将按预期工作:

    System.out.print("Number of users:");
    int noofUsers = scan.nextInt();
    scan.nextLine(); //Add that!

    if (noofUsers < 1 || noofUsers > 5000)
        return;
    String array[] = new String[noofUsers]; 
    for (int i = 0; i < noofUsers; i++)  
        System.out.print("Scan:["+i+"]");
        array[i] = scan.nextLine();

        Matcher m = p.matcher(array[i]);

        if (m.find())
            break;
        if (array[i].contains("ch") || array[i].contains("he") || array[i].contains("ef"))
            nooffriends++;
    

另一个更简单的解决方案是:

  for (int i = 0; i <= noofUsers; i++)  
        String currentMember=scan.nextLine();
        Matcher m = p.matcher(currentMember);
        if (m.find())
            break;
        if (currentMember.contains("ch") || currentMember.contains("he") || currentMember.contains("ef"))
            nooffriends++;
    

您不需要将所有答案存储在一个数组中。您可以只使用当前的操作然后忘记它;)

【讨论】:

我很高兴能帮上忙。您可以随时投票或接受答案;)【参考方案2】:

我认为是因为这条线

  int noofUsers=scan.nextInt();

我不确定您的输入文件格式。但如果它看起来像这样:

123\n
xxxxx\n
xxxx\n

函数 'nextInt' 只得到 123。而其他文本是:

\n
xxxxxx\n
xxxxxx\n

如果你想进入下一行,你需要读一个\n。 因此,您需要运行一个额外的 nextLine() 来获取 nextLine。

【讨论】:

以上是关于字符串数组大小和用于访问元素的 for 循环的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本中的数组常见使用方式

Java 增强for循环

增强的for循环

Java 增强 for 循环

JavaScript,遍历,for

Part6 数组指针与字符串 6.2 数组作为函数的参数 6.3对象数组 6.4基于范围的for循环