【问题标题】:Java Homework Reverse ArrayJava作业反向数组
【发布时间】:2014-10-18 15:49:24
【问题描述】:

我的作业详情

题目:一维数组

写一个java程序,先读入一个一维数组的大小,读入每个double类型的数组元素,把这个一维数组的顺序倒过来。 不要创建另一个数组来保存结果。 提示:使用文本中的代码交换两个元素。

样本输出:

请输入数组的大小:4

请输入4个双数:1.0、2.0、3.0、4.0

倒序后:4.0、3.0、2.0、1.0

我的作业有 2 个问题。想知道是否有人可以帮助我找到解决方案。

  1. 我需要使用
    填充数组 (double[] myArray) 的值 扫描仪输入来自单行的多个双打。
  2. 我需要颠倒数组中值的顺序,而无需 使用第二个数组。

这是我目前的代码。

Scanner sc = new Scanner(System.in);

System.out.println("Please input the size of array: ");
int arraySize = sc.nextInt(); //Stores user input
double[] myArray = new double[arraySize]; //Create array[userInput]

System.out.print("Please input " + arraySize + " double numbers: ");//Collect user input
int j = 0;
while (sc.hasNext()) { //Another Failed Attempt to collect the input from a single line
    if (sc.hasNextDouble()) {
        myArray[j] = sc.nextDouble(); //Insert user input into array
        j++;
    }
}           

Collections.reverse(Arrays.asList(myArray));//Doesn't work :(

System.out.println("After reverse order: ");
for (int i=0;i<arraySize;i++) 
    System.out.println(myArray[i]);

我的问题是,当用户给出双打的输入时,控制台移动到下一行仍然期待输入,如果输入是 ArrayIndexOutOfBounds 被抛出

【问题讨论】:

  • 你的代码有什么问题?它不会编译/抛出异常/返回错误结果吗?
  • 我没有看到您的问题/错误的描述
  • 提示:当你反转数组时,第一个元素和最后一个元素会发生什么?你对第二个元素和倒数第二个元素有什么看法?祝你好运!
  • 扫描仪 sc2 = new Scanner(System.in);整数 j = 0; while (sc2.hasNext()) { //Another Failed Attempt to collect the input from a single line if (sc2.hasNextDouble()) { myArray[j] = sc2.nextDouble(); //将用户输入插入数组j++; } } Collections.reverse(Arrays.asList(myArray));//不起作用:(
  • 对不起,我试图添加第二个扫描仪,我的问题是当用户给出双打的输入时,控制台移动到下一行仍然期待输入,如果输入是 ArrayIndexOutOfBounds 是抛出。

标签: java arrays


【解决方案1】:

你在这里误解了一些东西。

Collections.reverse(Arrays.asList(myArray)); 中,您使用Arrays.asList(myArray) 返回一个 List。之后你反转它,但你没有将它分配给一个变量,你只是失去了它。

这不是你需要做的。

您需要考虑另一种方法。

我会给你一个提示:在问题中使用提示!

如果你说你只需要反转它,你为什么需要排序呢?!

【讨论】:

  • asList 的 Java 文档说:Returns a fixed-size list backed by the specified array. (Changes to the returned list "write through" to the array.)
  • 我想用 for 循环来完成相反的操作,以遍历数组并从数组末尾开始打印每个双精度值并倒计时 i- 我相信我会收到标记为然而,这是因为赋值要求数组本身被反转:(
  • 再次:使用提示!您需要将第一个与最后一个交换,第二个与最后一个交换,直到到达中间,这就是提示!
【解决方案2】:

我需要使用填充数组 (double[] myArray) 的值 来自单行的扫描仪输入,用于多个双打。

如果我首先正确理解这一点,您需要阅读整行,然后解析它以从中读取所有双精度值。要从用户读取整行双打,您可以从处理System.in 流的扫描仪中调用nextLine。然后你可以

  • split 在空格上使用Double.parseDouble(String)(从String 获取double)在结果数组中的每个字符串元素上
  • 用另一个 Scanner 包装这一行并使用它的nextDouble

顺便说一句,如果您想在nextDouble(或nextIntnextAnythingExceptLine)之后阅读下一行,则需要使用另一种nextLine 方法使用提醒行分隔符(更多信息在这里Scanner is skipping nextLine() after using next(), nextInt() or other nextFoo() methods)。

所以你的作业的第一部分可能看起来像

Scanner sc = new Scanner(System.in);

System.out.println("Please input the size of array: ");
int arraySize = sc.nextInt(); 
sc.nextLine();//consume line separator to let `nextLine` read actuall next line
double[] myArray = new double[arraySize]; 

System.out.print("Please input " + arraySize
        + " double numbers in one line: ");
String line = sc.nextLine();
System.out.println("your numbers are "+line);

Scanner lineScanner = new Scanner(line);         
int j = 0;
while (lineScanner.hasNextDouble()) {
    myArray[j++] = lineScanner.nextDouble(); 
}
lineScanner.close();

您的第二个问题是generics don't support primitive types 所以T 中的asList(T..) 只能是对象类型。不幸的是autoboxing works only on primitive types,所以double[] 不能升级为Double[],因为每个数组已经是一个对象(甚至是原始类型的数组)。
这意味着 Arrays.asList(T.. data) 的结果 myArray 类型为 double[] 的结果不会返回 List&lt;double&gt;List&lt;Double&gt;List&lt;double[]&gt; — 一个包含一个对象的列表,传递的数组,而不是这个数组的元素。这就是为什么反转对你不起作用(反转包含一个元素的列表不会改变任何事情,因为你不能只用一个元素重新排序列表)。

要解决这个问题,只需将myArray 的类型从double[](原始类型数组)更改为Double[](对象类型数组),让泛型类型TasList(T..) 表示非原始类型Double(否则T只能推断为非原始double[]类型)。

所以换行

double[] myArray = new double[arraySize]; // Create array[userInput]

Double[] myArray = new Double[arraySize]; // Create array[userInput]

【讨论】:

  • 非常感谢,感谢您提供有关原始数组和对象数组的所有信息,并且我的程序现在可以正常运行,感谢您的帮助!
  • 不客气 :) 但下一次当你问问题时,重点不仅要描述你想要实现的目标,还要描述你的代码如何没有按预期工作。简单的“不起作用”告诉我们什么。代码中的注释很好,但它们不会取代问题本身的描述。无论如何,祝你学习顺利:)
【解决方案3】:

您可能必须在读取数组大小后实例化一个新的 Scanner。

    Scanner sc = new Scanner(System.in);
    System.out.println("Please input the size of array: ");
    int arraySize = sc.nextInt(); //Stores user input
    double[] myArray = new double[arraySize]; //Create array[userInput]
    sc.close();

    sc = new Scanner(System.in).useDelimiter(",");
    System.out.print("Please input " + arraySize + " double numbers: ");//Collect user input
    int j = 0;

【讨论】:

    【解决方案4】:
    Collections.reverse(Arrays.asList(myArray));//Doesn't work :(
    

    首先:Arrays.asList 获取 Object varargs,如果您传递原始数组,您将获得原始数组列表。

    第二个时刻:Arrays.asList 返回列表。如果您更改了它,则您的原始数组(从中创建列表)将不会被更改。

    您应该将集合改为数组并将其反转。 例如:

    Scanner sc = new Scanner(System.in);
    
    System.out.println("Please input the size of array: ");
    int arraySize = sc.nextInt(); //Stores user input
    
    System.out.print("Please input " + arraySize + " double numbers: ");//Collect user input
    List<Double> myList = new ArrayList<Double>();
    for (int i = 0; i < arraySize;) {
        if (sc.hasNextDouble()) {
            myList.add(sc.nextDouble());
            i++;
        }
    }  
    
    Collections.reverse(myList);//Doesn't work :(
    
    System.out.println("After reverse order: ");
    for (int i=0;i<arraySize;i++) 
        System.out.println(myList.get(i));
    

    【讨论】:

      【解决方案5】:

      用它来反转你的数组。

      你需要得到数组长度的一半才能得到数组的完整反转

      for(double i = 0; i < Array.length / 2; i++)
      {
          int x = Array[i];
          Array[i] = Array[Array.length - i - 1];
          Array[Array.length - i - 1] = x;
      }
      

      【讨论】:

        【解决方案6】:
        package display.pkg1;
        import java.util.Scanner;
        
        public class Display1 {
        
            public static void main(String[] args) {
                
                 Scanner input = new Scanner(System.in);
                 
           
                   System.out.println(" Enter the size of array ");
                int size = input.nextInt();
                 System.out.println(" Enter array Elements ");
                 
                 double []lol = new double [size];
                 
                 for(int i =0 ; i<size ; i++)
                 {
                 lol[i] = input.nextDouble();
                 
                 }
        
                  for(int i =size-1 ; i>=0 ; i--)
                 {
                               System.out.println(" Array element " + ( i +1) + " is " + lol[i]);
                  
                 }
            
        }
        }
        

        【讨论】:

          【解决方案7】:

          试试这个代码

          import java.util.Scanner;
          
          public class ReverseArray{
          
              public static void main(String[] args) {
          
                  Scanner sc = new Scanner(System.in);
          
                  System.out.println("Please input the size of array: ");
                  int arraySize = sc.nextInt(); //Stores user input
                  double[] myArray = new double[arraySize]; //Create array[userInput]
          
                  System.out.print("Please input " + arraySize + " double numbers: ");//Collect user input
          
                  for(int i = 0; i < myArray.length; i++){
                      if (sc.hasNextDouble()) {
                          myArray[i] = sc.nextDouble(); //Insert user input into array
                         }
                  }           
          
                  // Reverse myArray
                  for(int i = 0, j =  myArray.length-1; i < (myArray.length/2); i++, j--){
                      Double temp = myArray[i];
                      myArray[i] = myArray[j];
                      myArray[j] = temp;          
                  }
                  //Print the reversed myArray
                  System.out.println("After reverse order: ");
                  for (int i=0;i<arraySize;i++) 
                      System.out.println(myArray[i]);
              }
          }
          

          【讨论】:

          • 虽然这个答案可能是正确且有用的,但最好在其中附上一些解释来解释它如何帮助解决问题。如果有更改(可能不相关)导致它停止工作并且用户需要了解它曾经是如何工作的,这在未来变得特别有用。
          猜你喜欢
          • 2013-10-04
          • 1970-01-01
          • 2014-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多