2016-04-03 2 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

Пожалуйста, внимательно посмотрите на назначение, в нем четко указано: «Создайте класс с именем« Средний », но вы создаете« средний ». Кроме того, метод 'toString()' должен возвращать 'String' с элементами в порядке убывания и средним значением (для этой цели вы можете использовать StringBuilder), тогда как выполняемая вами реализация toString() возвращает« null » ... Кроме того, 'Arrays.sort (...)' Я думаю, использует 'QuickSort', а не' SelectionSort' –

ответ

0

Ваш ToString нужно возвращать строки, которые содержат как массив в порядке возрастания, а значит, его
Для этого вам понадобятся две переменные экземпляра в классе, который у вас уже есть
1. Массив: 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

Я не думаю, что нам разрешено использовать построитель строк еще –

+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 ...' будет неявно вызывать 'toString()' 'e1', следовательно только '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 в этом случае для ввода ввода от пользователя немного не прав IMHO. Предпочитайте буферизованные потоки для этой цели, и пусть они выполняют чтение байта.

Вот измененный код:

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()); 
    } 
} 
Смежные вопросы