2016-04-03 70 views
0

我收到這份作業,不知道如何繼續。試圖瞭解java中的「驅動程序」程序

我完成了以下任務:詢問5個數組輸入,從5個數據輸入的平均值並將其從最高到最低排序。

但我不明白什麼(toString)要求做什麼,它怎麼能返回包含數組的升序和平均值的「字符串」數據?

目前我的程序工作,但我認爲我做了一些不正確的操作符類(平均)的toString方法。

算類,驅動器類,輸出窗口:http://imgur.com/a/rj5NJ

分配:http://imgur.com/QC9LTrG

算類(平均)

import java.util.Scanner; 
    public class average 
{ 
    private int data[] = new int[5]; 
    private double mean = 0; 
    Scanner keyboard = new Scanner(System.in); 
    int i = 1; 
    int index = 0; 
    average() 
    { 

     for (int num : data) 
     { 
      System.out.print("Enter score for student " + i + " : "); 
      i++; 
      data[index] = keyboard.nextInt(); 
      index++; 
     } 

     toString(); 
    } 
    public void calculateMean() 
    { 
     double total = 0; 

     for (int num : data) 
     { 
      total = total + num; 
     } 

     mean = total/data.length; 
     System.out.println("Average score is :" + mean); 
    } 

    public String toString() 
    { 
     selectionSort(); 
     System.out.print("Data after selection sort (lowest to highest): "); 
     index = 0; 
     for (int num : data) 
     { 
      System.out.print(data[index] + " "); 
      index++; 
     } 

     System.out.println(""); 

     calculateMean(); 

     String result = null; 
     return result; 
    } 

    public void selectionSort() 
    { 

     java.util.Arrays.sort(data); 

    } 
} 

驅動器類(avgdr)

public class avgdr 
{ 
    public static void main(String[] args) 
    { 
     average e1 = new average(); 
    } 
} 

由於提前。

+0

請編輯您的問題,包括您需要的輸出精確的語言。不要鏈接到作業;鏈接可能隨時間而中斷。 –

+1

請仔細看看作業,它明確指出:「創建一個名爲Average的類」,但是您正在創建「平均」。此外,'toString()'方法應該返回一個帶有降序順序元素的字符串(您可以使用StringBuilder來實現此目的),而由您完成的'toString()'實現返回'null' ... ...此外,'Arrays.sort(...)'我想使用'QuickSort'而不是'SelectionSort' –

回答

0

你需要的toString返回字符串包含按升序排列都和,意味着它
爲此,您需要在您的類中的兩個實例變量,你已經
1陣列:int數據[] =新INT [5]
2.平均:雙平均
只是把從輸入用戶打電話給你的選擇排序和calculateMean方法,即調用toString方法裏面做沒有進一步計算後只是簡單的返回字符串你想

import java.util.Scanner; 
public class average { 
private int data[] = new int[5]; 
private double mean = 0; 
Scanner keyboard = new Scanner(System.in); 
int i = 1; 
int index = 0; 
average() 
{ 

    for (int num : data) 
    { 
     System.out.print("Enter score for student " + i + " : "); 
     i++; 
     data[index] = keyboard.nextInt(); 
     index++; 
    } 
    selectionSort(); 
    calculateMean(); 
    toString(); 
} 
public void calculateMean() 
{ 
    double total = 0; 

    for (int num : data) 
    { 
     total = total + num; 
    } 

    mean = total/data.length; 
    System.out.println("Average score is :" + mean); 
} 

public String toString() 
{ 
    StringBuilder builder = new StringBuilder(); 
    builder.append("Sorted Data is: "); 
    for (int num : data) 
    { 
     builder.append(data[index] + " "); 
     index++; 
    } 
    builder.append(", Mean is: ").append(mean); 
    return builder.toString(); 
} 

public void selectionSort() 
{ 
    java.util.Arrays.sort(data); 

} 

}

+0

我不認爲我們被允許使用stringbuilder –

+0

您可以使用System.Out.println )或簡單的字符串,根據您的要求。 StringBuilder僅用於性能目的 – Prateek

+0

,所以我把數組放入一個字符串?我怎樣才能做到這一點? –

1

正如它所說的,在賦值中,你的構造函數應該從用戶那裏得到輸入,並且已經進行了計算均值的計算。

在計算均值之後,toString方法應該只是答案,即它應該打印對象狀態。 [數組中的所有值和平均值。]

public String toString() { 
    return "Data after selection sort (lowest to highest): " 
      + Arrays.toString(data) + "\nAverage score is: " + mean; 
} 

所以所有的計算和方法應該從構造函數中調用。和toString方法,你可以從構造函數或驅動類中調用。 它是一種通常的做法,從驅動程序類調用它,如下 - 驅動程序類

public class avgdr { 
    public static void main(String[] args) { 
     average e1 = new average(); 
     System.out.println(e1); 
    } 
} 

自動調用System.out.println(e1);,類的toString方法將被調用和返回的字符串會在控制檯上顯示出來。

和構造將是這個樣子 -

average() { 
    for (int num : data) { 
     System.out.print("Enter score for student " + i + " : "); 
     i++; 
     data[index] = keyboard.nextInt(); 
     index++; 
    } 
    selectionSort(); 
    calculateMean(); 
} 
+0

感謝您的解釋。 –

+0

我喜歡這個答案,直到你寫了System.out.println(e1.toString());':-),因爲'System.out ...'會隱式地調用'e1'的toString()',因此只剩下''System.out.println(e1);',這樣做:-) +1,我錯過了你在'toString()'實現中顯示的內容,調用'Arrays.toString(data)'' :-) –

+0

感謝您的糾正,實際上,隱式toString將被調用。在驅動程序類中,它應該被調用如下: \t \t'System.out.println(e1);' 在我的回答中更正了它 –

0
public String toString() //overriding toString() method here. This method belongs to Object Class. 
    { 
     selectionSort(); // calling selectionSort() here. 
     System.out.print("Data after selection sort (lowest to highest): "); 
     index = 0; 
     for (int num : data) 
     { 
      System.out.print(data[index] + " "); 
      index++; 
     } 

     System.out.println(""); 

     calculateMean(); // Calling calculateMean() here. 

     String result = null; 
     return result; 
    } 

現在您所呼叫的內部構造這種方法

平均() {

for (int num : data) 
    { 
     System.out.print("Enter score for student " + i + " : "); 
     i++; 
     data[index] = keyboard.nextInt(); 
     index++; 
    } 

    toString(); //calling toString Method Here. 
} 

執行流程: - 您正在調用的內部構造函數toString()內部調用兩個函數A)selectionSort();和B)selectionSort();的方法。而在main()裏面你做的實例是average e1 = new average();平均值。它調用構造函數所以,執行將會像Constuctor>toString()>calculateMean()selectionSort()

0

事實證明,你似乎不可以在代碼的任何地方調用toString()。只要它返回一個String組成的所有元素降序和mean。此外,在這種情況下,您使用Decorator,Scanner的方式從用戶處獲取輸入的方式稍有不對。爲此目的優先選擇緩衝流,並讓它們進行字節讀取。

下面是修改代碼:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.IOException; 

import java.util.Arrays; 

public class Average { 

    private static final int TOTAL_SCORES = 5; 

    private int [] data; 
    private double mean; 

    private BufferedReader inputStream; 

    public Average() { 
     data = new int [ TOTAL_SCORES ]; 
     try { 
      inputStream = new BufferedReader ( 
         new InputStreamReader (System.in)); 
      for (int i = 0; i < data.length; ++i) { 
       System.out.print ("Enter Score Number " + (i + 1) + ": "); 
       data [ i ] = Integer.parseInt (inputStream.readLine()); 
      } 
     } catch (IOException ioex) { 
      ioex.printStackTrace(); 
     } 

     selectionSort(); 
     calculateMean(); 
    } 

    private void selectionSort() { 
     for (int i = 0; i < (data.length - 1); ++i) { 
      int max = i; 
      for (int j = (i + 1); j < data.length; ++j) { 
       if (data [ max ] < data [ j ]) { 
        max = j; 
       } 
      } 
      if (max != i) { 
       int temp = data [ max ]; 
       data [ max ] = data [ i ]; 
       data [ i ] = temp; 
      } 
     } 
    } 

    private void calculateMean() { 
     double result = 0.0; 
     for (int number : data) { 
      result += number; 
     } 
     result /= data.length; 

     mean = result; 
    } 

    @Override 
    public String toString() { 
     StringBuilder sb = new StringBuilder(); 
     sb.append ("Elements: \n"); 
     for (int number : data) { 
      sb.append (number + "\n"); 
     } 
     sb.append ("Mean: " + mean); 

     return sb.toString(); 
    }  

    private void display (int [] data) { 
     System.out.println ("Data in Array is: "); 
     for (int number : data) { 
      System.out.println (number); 
     } 
    } 

    public static void main (String [] args) { 
     System.out.println (new Average()); 
    } 
}