2017-05-23 8 views
-1

Ich muss eine Schnittstelle implementieren und es in zwei verschiedenen Klassen eins mit Array und eins mit List ausprobieren. In diesen Klassen haben wir verschiedene Methoden hinzufügen, wie in der Schnittstelle zu sehen ->Implementieren von Interface und Ausprobieren mit Array und List - Java

public interface IStatistics { 
    public void addSample(String name, GregorianCalendar date, double value); 
    public double getMeanTemperature(int month); 
    public double getMedianTemperature(int month); 
    public double getVariance(int month); 
    public double getStandardDeviation(int month); 
    public void printSamples(int month); 

} 

Ich habe schon das meiste davon gemacht, aber es sollte nur die Werte eines bestimmten Monats verwenden, die nicht in den beiden Methoden funktioniert . In dieser Übung erhalten wir jeden Tag einen bestimmten Wert (Name, Datum, Temperatur). Ich weiß nicht, wie man es schafft, nur die Werte von einem Monat zu verwenden (was in beiden Klassen nicht funktioniert). In der Liste habe ich es schon ausprobiert, aber es funktioniert überhaupt nicht.

@Override 
    public double getMeanTemperature(int month) { 
     MeasurementValue m = this.head; 
     double result = 0; 
     while(m.date.get(GregorianCalendar.MONTH)==month){ 
      while(m!=null){ 
       result = result + m.temp; 
       m=m.getNext(); 
      } 
      result = result/this.num; 
     } 
     return result; 
    } 

Und in der Klasse mit Array weiß ich nicht einmal, wie ich anfangen soll.

@Override 
    public double getMeanTemperature(int month) { 
     double sum = 0.0; 
     for(double a : values) 
      sum += a; 
     return sum/numValues; 
    } 

Auch es druckt die Daten nicht korrekt aus. Vielleicht kennt jemand eine Lösung dafür.

import java.util.GregorianCalendar; 

import kwm.statistics.IStatistics; 
import kwm.statistics.MeasurementArray; 
import kwm.statistics.MeasurementList; 

public class TestStatistics { 

    public static void main(String[] args) { 
     GregorianCalendar date = new GregorianCalendar(2017,05,12); 
     GregorianCalendar date1 = new GregorianCalendar(2017,05,02); 
     GregorianCalendar date2 = new GregorianCalendar(2017,05,22); 
     GregorianCalendar date3 = new GregorianCalendar(2017,06,06); 
     GregorianCalendar date4 = new GregorianCalendar(2017,05,18); 

//  ***TESTLIST*** 
     IStatistics statistics1 = new MeasurementList(); 
     statistics1.addSample("Lisa", date, 12); 
     statistics1.addSample("Lisa", date1, 17); 
     statistics1.addSample("Lisa", date2, 14); 
     statistics1.printSamples(5); 

//  ***TESTARRAY*** 
     IStatistics statistics2 = new MeasurementArray(); 

     statistics2.addSample("Lisa", date, 12); 
     statistics2.addSample("Lisa", date1, 5); 
     statistics2.addSample("Lisa", date2, 40); 
     statistics2.addSample("Lisa", date3, 31); 
     statistics2.addSample("Lisa", date4, 23); 
     statistics2.printSamples(5); 

    } 

} 

, dass der Code für die Ausgabe in MeasurementValue ist

public void output(){ 
    GregorianCalendar date = this.date; 
    SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy"); 
    System.out.print(sdf.format(date.getTime())); 
} 

Und der Code für die Ausgabe in MeasurementList.

public void printSamples(int month) { 

     MeasurementValue m = this.head; 
//  while(m.date.get(GregorianCalendar.MONTH)==month){ 
      while(m != null){ 
       if(month>=0 && 11>=month){ 
        System.out.println("Name: "+m.getName()); 
        System.out.println("Value: "+m.getTemp()); 
        System.out.print("Date: ");m.output(); 
        System.out.print("\n"); 
        System.out.print("*****************\n\n"); 
        m = m.getNext(); 
       } 
      } 
//  } 
     System.out.print("\n"); 
    } 

Danke für jede Hilfe!

+5

Zu viel Code. Bitte erstellen Sie ein [MCVE] (https://stackoverflow.com/help/mcve). Mit einem Schwerpunkt auf ** minimal **. – Turing85

+2

Niemand hier wird eine Codewand lesen. – OldProgrammer

+2

oder Debug es für die Angelegenheit – redFIVE

Antwort

0

Für die verkettete Liste Version, versuchen, etwas wie folgt aus:

@Override 
public double getMeanTemperature(int month) { 
    double total = 0d; 
    int num = 0; 
    for (MeasurementValue m = this.head; m != null; m = m.getNext()) { 
     if (m.date.get(Calendar.MONTH) == month) { 
      total += m.temp; 
      num++; 
     } 
    } 
    if (num == 0) { 
     // Avoid division by zero 
     return 0d; 
    } 
    return total/(double) num; 
} 

Gleiches Prinzip für das Array, aber sie iterieren anders (und Sie müssen auch die Monate speichern).

Verwandte Themen