2014-10-18 30 views
-1

詳細的Java作業反向陣列我的功課

主題:一維數組

寫在一個維數組的大小先讀一個java程序,在雙類型的每個數組元素讀,顛倒了這個一維數組的順序。 不要創建另一個數組來保存結果。 提示:使用文本中的代碼交換兩個元素。

樣本輸出:

請輸入數組的大小:4

請輸入4雙號:1.0,2.0,3.0,4.0

相反的順序後:4.0,3.0,2.0, 1.0

我有2個問題與我的任務。想知道是否有人能幫我找到解決辦法。

  1. 我需要(雙[] 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被拋出

+1

什麼是你的代碼錯誤的完全反轉?它不會編譯/拋出異常/返回錯誤的結果嗎? – Pshemo 2014-10-18 15:51:58

+2

我沒有看到你的問題描述/錯誤 – Dima 2014-10-18 15:52:30

+0

使用堆棧! ;-) – jahroy 2014-10-18 15:55:03

回答

1

我需要填充一個數組的值(雙[] myArray的),使用從多個雙打單行 掃描儀輸入。

如果我首先正確理解這個,你需要讀整行然後解析它來讀取它的所有double值。要從用戶讀取整行雙打,您可以從處理System.in流的掃描儀調用nextLine。此後,您可以

  • split空間上線使用Double.parseDouble(String)(獲得doubleString)每個字符串元素從結果數組
  • 包裝這條線與另一掃描,並使用其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(); 

你的第二個問題是,在這樣asList(T..)T只能對象類型。不幸的是autoboxing works only on primitive types,所以double[]無法升級到Double[],因爲每個數組已經是一個對象(甚至原始類型的數組)。
這意味着Arrays.asList(T.. data)的爲double[]類型的參數myArray不會返回List<double>List<Double>List<double[]>該結果 - 其保持一個對象,傳遞的數組,該數組的不是單元的明細表。這就是爲什麼逆向不適用於你(包含一個元素的逆向列表不會改變任何內容,因爲你不能僅使用一個元素重新排列列表)。

要從asList(T..)解決這個問題簡單地改變的myArray形式double[](原始類型的陣列)類型Double[](對象類型的陣列),讓一般類型T表示非原始Double(否則T只能被推斷爲非原始的double[]類型)。

因此改變你的線

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

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

非常感謝,我感謝所有關於原始數據和對象數組的信息,並且我現在完成了該程序的完美工作,感謝幫助! – 2014-10-18 16:52:12

+0

歡迎您:)但真的下一次當您提問時重點不僅要描述你想要達到的目標,還要描述你的代碼不能如你所期望的那樣工作。簡單的「不起作用」沒有告訴我們什麼。代碼中的註釋很好,但它們不會替代問題本身的描述。無論如何祝你好運:) – Pshemo 2014-10-18 16:55:06

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

你在這裏誤解了一些東西。

Collections.reverse(Arrays.asList(myArray));您使用Arrays.asList(myArray)即返回List。之後,您將其逆轉,但您不會將其分配給一個變量,而只會丟失它。

這不是你需要做的。

你需要想想另一種方式。

我給你一個提示:在問題中使用提示!

如果你說你只是需要扭轉它,爲什麼你需要排序呢?!

+0

'asList'的Java文檔說:'返回由指定的ar支持的固定大小的列表射線。 (對返回列表的改變「直通」到數組中。)' – PeterMmm 2014-10-18 16:24:14

+0

我想完成相反的操作,使用for循環來遍歷數組,並打印每個從數組尾部開始的double值並將i-- 我相信我會得到點標記爲此但作爲該任務調用陣列本身相反:( – 2014-10-18 16:43:29

+0

再次使用!提示!你需要交換第一次與最後一秒,第二次與前一次直到你到中間,這就是提示! – Dima 2014-10-18 16:58:56

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

首先:Arrays.asList獲得Object可變參數,如果您傳遞原始數組,您將獲得原始數組列表。

第二時刻: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)); 
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]); 
    } 
} 
+1

雖然這個答案可能是正確和有用的,但如果你包含一些解釋並解釋它是如何幫助解決問題的話,那麼它是首選。如果存在導致其停止工作並且用戶需要了解其曾經工作的變化(可能不相關),這在未來變得特別有用。 – 2015-05-29 22:12:32

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