我的家庭作业详情
主题:单维数组
编写一个首先读取一维数组大小的java程序,读入double类型的每个数组元素,反转这个一维数组的顺序。 不要创建另一个数组来保存结果。 提示:使用文本中的代码交换两个元素。
示例输出:
请输入数组大小:4
请输入4个双号:1.0,2.0,3.0,4.0
逆序后:4.0,3.0,2.0,1.0
我的任务有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
则抛出
答案 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
(或nextDouble
或nextInt
)之后阅读下一行,则需要使用其他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}}结果不会返回myArray
或double[]
,而是 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]);
}
}
}