【问题标题】:Array Only Prints Certain Elements and Not Others数组只打印某些元素而不打印其他元素
【发布时间】:2020-04-09 21:11:09
【问题描述】:

我目前正在上计算机语言入门课程,每个人都有几节课我必须开发一些最小的程序(我们有 5 个不同的提示,必须选择其中的三个来完成)。由于时间的关系,我继续前进并完成了一个不同的程序,但我仍然想了解这个程序出了什么问题。 它应该使用 for 循环和不同的方法将给定的短语翻译成 Pig Latin(在他们的模板中分解,我无法更改,尽管我知道有更有效的方法)。我可以得到要翻译的短语中的单词,但是当我打印出数组时(通过将其转换为字符串或运行 for 循环以分别打印出每个元素),某些元素仅打印参考代码。有人可以告诉我发生了什么事吗?下面是代码,然后是一些打印输出的示例。

import java.util.Arrays;
import java.util.Scanner;

public class PigLatin {
  public static void main (String[] args){
      Scanner scnr = new Scanner(System.in);
      String userWord;

      userWord = scnr.nextLine();
      userWord = userWord.toLowerCase();

      String[] wordArry = userWord.split(" ");

      print(wordArry);
  }

  public static String[] translate(String[] words){
     String[] pigLatin = new String[words.length];

     for (int i = 0; i < words.length; ++i) {
         if (isVowel(words[i].charAt(0)) == true){
             pigLatin[i] = words + "ay"; 
         }
         else if (words[i].charAt(0) == 'y') {
             pigLatin[i] = words[i].substring(findFirstVowel(words[i]), words[i].length()) + words[i].substring(0, findFirstVowel(words[i])) + "ay";
         }
         else {
             pigLatin[i] = words[i].substring(findFirstVowel(words[i]), words[i].length()) + words[i].substring(0, findFirstVowel(words[i])) + "ay";
         }
     }
     return pigLatin;
  }
  public static int findFirstVowel(String s){
      char[] vowList = {'a','e','i','o','u','y'};

        for (int i = 1; i < s.length(); ++i) {
            for (int j = 0; j < vowList.length; ++j) {
                if (s.charAt(i) == vowList[j]) {
                    return i;
                }
            }
        }
    return -1;
   }
  public static boolean isVowel(char c){
      boolean vowel = false;
      char[] vowList = {'a','e','i','o','u'};

      for (int i = 0; i < vowList.length; ++i) {
          if (c == vowList[i]) {
              vowel = true;
          }
      }
      return vowel;
  }
  public static void print(String[] words){

      String[] newArry = new String[words.length];

      for (int i = 0; i < words.length; ++i) {
          newArry[i] = words[i];
      }

      String finalPrint = Arrays.toString(translate(newArry));
      finalPrint = finalPrint.replace("[", "");
      finalPrint = finalPrint.replace(",", "");
      finalPrint = finalPrint.replace("]", "");

      System.out.println(finalPrint);

  }
}

以下是一些打印的回复:

输入:西班牙的雨水主要停留在平原 输出:ethay ainray [Ljava.lang.String;@17c68925ay ainspay aysstay ainlymay [Ljava.lang.String;@17c68925ay ethay ainplay 预期:ethay ainray inay ainspay aysstay ainlymay inay ethay ainplay

输入:你应该继续回答汤问题 输出: ouyay ouldshay avehay ayedstay ithway ethay oupsay uestionqay 此打印正确

输入:构成梦想的材料 输出:ethay uffstay atthay eamsdray [Ljava.lang.String;@17c68925ay ademay [Ljava.lang.String;@17c68925ay 预期:ethay uffstay atthay eamsdray areay ademay ofay

我找不到关于为什么会发生这种情况的答案。如果您需要任何其他信息,请告诉我。谢谢!

【问题讨论】:

    标签: java arrays printing


    【解决方案1】:

    您在此块中有一个错误(可能是错字):

    if (isVowel(words[i].charAt(0)) == true){
        pigLatin[i] = words + "ay"; 
    }
    

    应该是(请注意,您不需要将布尔值与true 进行比较):

    if (isVowel(words[i].charAt(0))) {
        pigLatin[i] = words[i] + "ay";
    }
    

    另外,您不需要在 print() 方法中复制数组 - translate() 不会以任何方式修改输入数组。

    最后,您可以使用 String.join,而不是替换 Arrays.toString 的输出,因此您的打印方法如下所示:

    public static void print(String[] words){
        System.out.println(String.join(" ", translate(words)));
    }
    

    【讨论】:

    • 非常感谢!这正是问题所在。我还是数组的新手,我无法理解那个数组。
    【解决方案2】:
    pigLatin[i] = words + "ay";
    

    这一行。您正在将字符串附加到数组中。将其更改为:

    pigLatin[i] = words[i] + "ay";
    

    旁注1:

    for (int i = 0; i < words.length; ++i) {
        newArry[i] = words[i];
    }
    

    这个循环可以改成:

    System.arraycopy(words, 0, newArry, 0, words.length);
    

    旁注2:

    在"\\s+" 上拆分更好。它还处理多个空间。


    旁注3:

    if (isVowel(words[i].charAt(0)) == true) {
    

    这可以简化为:

    if (isVowel(words[i].charAt(0))) {
    

    旁注4:

    for (char value : vowList) {
        if (c == value) {
            vowel = true;
            break;
        }
    }
    

    使用 break 来获得更好的性能。另外,使用 foreach 循环。


    最后附注:

    finalPrint = finalPrint.replace("[", "")
            .replace(",", "")
            .replace("]", "");
    

    替换调用链。

    【讨论】:

    • 我做了那个改变,你是绝对正确的!那确实解决了它!我还是新手,我们刚刚开始使用数组。现在我只需要弄清楚为什么我的 isVowel 方法需要将 'y' 识别为元音,而如果它是第一个字符,程序应该将它视为辅音(这就是为什么有 if 语句,即使它在技术上是isVowel 方法中的地址),大声笑。谢谢!
    • 听起来不错。您也可以查看我的附注以获得更好的编码。
    • 谢谢你!任何一点点都有帮助。不过,我还有一个问题。为什么原始代码适用于某些作品而不适用于其他作品?您的修复解决了这个问题,但我仍然不明白为什么它只在某些时候有效。
    猜你喜欢
    • 2016-01-28
    • 2016-05-17
    • 2013-09-12
    • 1970-01-01
    • 2011-03-23
    • 2014-12-08
    • 1970-01-01
    • 2017-10-13
    • 2021-08-13
    相关资源
    最近更新 更多