2016-07-18 10 views
2

Ich habe zwei Probleme mit meinem Code. 1) Es gibt mir nicht den richtigen Durchschnittswert, wenn ich meiner Arraylist Werte hinzufüge, also weiß ich, dass mein Zustand in meiner for-Schleife ausgeschaltet ist und 2) Es zeigt nicht alle Zahlen in meiner arrayList an. Es zeigt speziell nicht die 0. ganze Zahl.ArrayList Berechne Durchschnitt durch Fallenlassen Kleinste

Hier ist mein Code:

public class CalcAvgDropSmallest { 

    public static void main(String[] args) {  
     int lowNum = 0; // # of the lowest numbers to be dropped 
     double average; // calcuates the mean of the sum and the lowest numbers dropped 
     ArrayList<Double> inputs= getALInfo(); 
     lowNum = getLowestnum(); 
     average = calculateAvg(inputs, lowNum); 
     getAvg(inputs, lowNum, average); 

    } 

    public static ArrayList<Double> getALInfo() { 
     ArrayList<Double> inputs = new ArrayList<Double>(); 

     // Read Inputs 
      Scanner in = new Scanner(System.in); 
      System.out.println("Please enter 5 - 10 integers, Q to quit: ");   
      Double vals = in.nextDouble(); 

     while (in.hasNextDouble()) 
      { 
       inputs.add(in.nextDouble()); 
      }    

     return inputs;  
    } 

    public static int getLowestnum() {   
     int lowNum = 0; 

     // Reads Input value for # of lowest values dropped 

     System.out.println("How many of the lowest values should be dropped?"); 
     Scanner in = new Scanner(System.in); 
     lowNum = in.nextInt(); 

     return lowNum; 

    } 

    public static double calculateAvg(ArrayList<Double> inputs, int lowNum) { 
     double sum = 0; 
     double average = 0;     
     int i = 0; 
     // Calcuates the average of the array list with the lowest numbers dropped 

     for (i = 0; i < inputs.size(); i++) 
     { 
      if (inputs.get(i) > lowNum) { 
       sum = sum + inputs.get(i); 
      } 
     } 
     average = (sum/inputs.size());   

     return average; 
    } 

    public static void getAvg(ArrayList<Double> inputs,int n, double average) { 
     // It's adding all the values and dividing by the size of it, which is a problem 
     // Also, it's not showing the 0th integer aand just straight to the 1st integer 
     System.out.println("The average of the numbers " + inputs + " except the lowest " +n+ " is " +average); 
    } 
} 
+2

Sie Wegwerfen die ersten Doppel eingegeben! –

+0

Hier: 'Double vals = in.nextDouble();'. Tun Sie das nicht, ignorieren Sie diesen ersten Eintrag nicht. Sie geben Vals ein, aber legen Sie es nie in Ihre ArrayList. –

+0

Danke! Ich habe es jetzt behoben. –

Antwort

4

Zuerst programmieren Sie bitte die List Schnittstelle (anstelle des ArrayList Beton-Typ). Zweitens sollten Sie sicherstellen, dass Sie jeden Wert, den Sie lesen, zu Ihrem List hinzufügen. Stellen Sie dann sicher, dass Sie den abschließenden Wert gelesen haben (und ihn verwerfen). andernfalls wird es im Puffer ausstehen. Schließlich würde ich die Scanner in die Methoden übergeben (anstatt sie lokal neu zu deklarieren). Wie,

public static List<Double> getALInfo(Scanner in) { 
    List<Double> inputs = new ArrayList<>(); 
    System.out.println("Please enter 5 - 10 integers, Q to quit: "); 
    while (in.hasNextDouble()) { 
     inputs.add(in.nextDouble()); 
    } 
    in.next(); 
    return inputs; 
} 

könnten Sie vereinfachen getLowestnum wie

public static int getLowestnum(Scanner in) { 
    System.out.println("How many of the lowest values should be dropped?"); 
    return in.nextInt(); 
} 

Ihr Dann calculateAvg sollte die List sortieren und nehmen Sie sich ein subList (Verwerfen lowNum Werte) und schließlich den Mittelwert zurück. So etwas wie,

public static double calculateAvg(List<Double> inputs, int lowNum) { 
    Collections.sort(inputs); 
    return inputs.subList(lowNum, inputs.size()).stream() 
      .mapToDouble(Double::doubleValue).average().getAsDouble(); 
} 

Und dann main vervollständigen das Beispiel

public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
    List<Double> inputs = getALInfo(in); 
    int lowNum = getLowestnum(in); 
    double average = calculateAvg(inputs, lowNum); 
    System.out.printf("%.2f%n", average); 
}