2016-04-03 73 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()); 
    } 
}