2016-04-03 5 views
0

Ich erhielt diese Aufgabe und bin mir nicht sicher, wie es weitergehen soll.Versuch, "Treiber" -Programm in Java zu verstehen

Ich erfüllte die Aufgabe von: 5 Array-Eingaben zu fragen, den Mittelwert von 5 Daten einzugeben und ihn von der höchsten zur niedrigsten zu sortieren.

Aber ich verstehe nicht, was (toString) zu tun ist, wie kann es eine "String" -Daten mit einer aufsteigenden Reihenfolge des Arrays und der Mittelwert zur gleichen Zeit zurückgeben?

Derzeit funktioniert mein Programm, aber ich denke, ich habe etwas falsch mit der toString-Methode in der Operator-Klasse (Durchschnitt).

Operator-Klasse, Fahrerklasse, Ausgabefenster: http://imgur.com/a/rj5NJ

Aufgabe: http://imgur.com/QC9LTrG

Operator-Klasse (Durchschnitt)

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

    } 
} 

Treiberklasse (avgdr)

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

Dank im Voraus.

+0

Bearbeiten Sie Ihre Frage, die genaue Sprache für die Ausgabe enthalten, die Sie benötigen. Verknüpfen Sie nicht mit der Aufgabe; Links können im Laufe der Zeit brechen. –

+1

Bitte schauen Sie sich die Aufgabe genau an, sie sagt klar: 'Erstellen Sie eine Klasse namens Durchschnitt, aber Sie erstellen 'Durchschnitt'. Außerdem sollte die 'toString()' Methode eine 'String' mit Elementen in absteigender Reihenfolge und Mittelwert (Sie können einen StringBuilder für diesen Zweck verwenden) zurückgeben, während die von Ihnen durchgeführte toString()' Implementierung 'null' zurückgibt ... Darüber hinaus '' Arrays.sort (...) 'nehme ich' QuickSort' und nicht 'SelectionSort' an. –

Antwort

0

Ihre toString müssen String zurück, die sowohl Array in aufsteigender Reihenfolge enthalten und bedeuten davon
Dazu benötigen Sie zwei Instanzvariable in der Klasse, die Sie bereits
1. Array haben: int data [] = new int [5]
2. Mittelwert: Doppel mittlere
kurz nach Eingabe von Benutzer rufen Sie Ihren SelectionSort und calculateMean Methode nehmen, nach dem Aufruf toString Methode, die nur einfach zurückgeben die Zeichenfolge keine weitere Berechnung wollen Sie

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

Ich glaube nicht, dass wir String Builder noch verwenden dürfen –

+0

Sie können System.Out.println () oder einfache Schnur, entsprechend Ihrer Anforderung. StringBuilder wird nur für Performance-Zwecke – Prateek

+0

verwendet, so dass ich das Array in eine Zeichenfolge? Wie kann ich das machen? –

1

Wie es heißt, in der Zuordnung sollte Ihr Konstruktor die Eingabe vom Benutzer nehmen und bereits die Berechnung des Mittelwerts berechnen.

Nachdem der Mittelwert berechnet wurde, sollte die toString-Methode einfach die Antwort sein, d. H. Sie sollte den Objektstatus drucken. [Alle Werte in Array und dem Mittelwert.]

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

So ist die ganze Berechnung und das Verfahren sollten vom Konstruktor aufgerufen werden. Und die toString-Methode können Sie vom Konstruktor oder von der Treiberklasse aus aufrufen. Es ist eine übliche Praxis, sie von der Treiberklasse zu nennen, wie unten - der Fahrer Klasse

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

Auf System.out.println(e1); Aufruf der toString-Methode der Klasse wird automatisch aufgerufen und die zurückgegebene Zeichenkette wird auf der Konsole angezeigt werden.

und der Konstruktor wird wie folgt aussehen -

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

Danke für die Erklärung. –

+0

Ich mochte die Antwort, bis Sie 'System.out.println (e1.toString()) geschrieben haben;' :-), da 'System.out ...' implizit 'toString()' von 'e1' aufrufen wird nur 'System.out.println (e1);', das geht :-) +1 für den Rest, verpasste ich, was Sie in Ihrer 'toString()' Implementierung gezeigt haben, einen Aufruf von 'Arrays.toString (data)' :-) –

+0

Danke für die Korrektur, eigentlich wird implizit toString aufgerufen. In der Treiberklasse sollte es wie folgt aufgerufen werden: \t \t 'System.out.println (e1);' Korrigiert es in meiner Antwort –

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

jetzt Sie diese Methode innerhalb Constructor rufen

Durchschnitt() {

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

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

Ablauf der Ausführung: - Innerhalb des Konstruktors rufen Sie die Methode toString() auf, die intern zwei Funktionen aufruft A) selectionSort(); und B) selectionSort();. Und innerhalb main() machen Sie die Instanz average e1 = new average();Durchschnitt. was den Konstruktor aufruft So wird die Ausführung wie Constuctor>toString()>calculateMean() und selectionSort() sein.

0

Wie sich herausstellte, scheint es, dass Sie von keinem Ort des Codes aus toString() anrufen sollen. Machen Sie einfach eine String aus allen Elementen in absteigender Reihenfolge und die mean. Darüber hinaus ist die Art und Weise, wie Sie eine Decorator, Scanner in diesem Fall verwenden, um eine Eingabe vom Benutzer zu nehmen, nicht richtig IMHO. Bevorzugen Sie gepufferte Streams für diesen Zweck und lassen Sie sie das Byte lesen. Hier

ist der modifizierte Code:

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