Java家庭作业反向数组

时间:2014-10-18 15:49:24

标签: java arrays

我的家庭作业详情

  

主题:单维数组

     

编写一个首先读取一维数组大小的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. 我需要反转数组内的值的顺序WITHOUT 使用第二阵列。
  3. 到目前为止,这是我的代码。

    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则抛出

7 个答案:

答案 0 :(得分:2)

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

Collections.reverse(Arrays.asList(myArray));中,您使用的Arrays.asList(myArray)返回 List。然后你反转它,但是你没有把它分配给一个变量而你就丢失了它。

这不是你需要做的事情。

你需要考虑另一种方法。

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

如果你说你只需要扭转它,你为什么要对它进行排序?!

答案 1 :(得分:1)

  

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

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

    在空格中
  • System.in行,并在结果数组中的每个String元素上使用split(从Double.parseDouble(String)获取double
  • 用另一台扫描仪包装此行并使用其String

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

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

nextLine

您的第二个问题是generics don't support primitive types因此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(); 中的T只能是对象类型。遗憾的是autoboxing works only on primitive types,因此asList(T..)无法升级为double[],因为每个数组已经是一个对象(甚至是基本类型的数组)。
这意味着类型为Double[]的参数Arrays.asList(T.. data)的{​​{1}}结果不会返回myArraydouble[],而是 List<double> - 一个包含一个对象的列表,即传递的数组,而不是该数组的元素。这就是为什么反转对你不起作用(包含一个元素的反转列表没有任何改变,因为你不能只用一个元素重新排序列表)。

要解决此问题,只需将List<Double>表单List<double[]>(基本类型数组)的类型更改为myArray(对象类型数组),以使通用类型double[]来自Double[]代表非原始T(否则asList(T..)只能被推断为非原始Double类型)。

所以改变你的行

T

double[]

答案 2 :(得分:0)

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

    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;

答案 3 :(得分:0)

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

答案 4 :(得分:0)

试试此代码

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

答案 5 :(得分:0)

使用它来反转你的数组。

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

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 :(得分:0)

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