Java: сканер из файла в Arraylist, затем min / max / mean / standarddeviation - PullRequest
0 голосов
/ 07 сентября 2011

Назначение - создать программу, которая будет считывать из стандартного ввода (файл, содержащий список целых чисел) в массив, а затем находить среднее, максимальное, минимальное, среднее значение и стандартное отклонение этих целых чисел. обо всем по порядку, вот код:

import java.io.*;
import java.util.*;


public class DescriptiveStats
{

protected List<Integer> scores = new ArrayList<Integer>();

public DescriptiveStats()
{
    // default constructor
}


public void main(String[] args) throws IOException
{

    try{
        Scanner sc = new Scanner(new FileReader("students.txt"));
        while(sc.hasNextInt())
        {
            scores.add(sc.nextInt());
        }
        sc.close();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }

    DescriptiveStats stat = new DescriptiveStats();
    System.out.println("Min = " + stat.getMin(scores[]));
    System.out.println("Max = " + stat.getMax(scores[]));
    System.out.println("Median = " + stat.getMedian(scores[]));
    System.out.println("Mean = " + stat.getMean(scores[]));
    int Mean = stat.getMean(scores[]);
    System.out.println("Standard Deviation = " + stat.getStandardDev(scores[], Mean));
}


public int getMin(int []lst)
{
    int min = lst[0];
    for(int i=0;i<lst.length;i++)
    {                                      
        if(min>lst[i])
        min=lst[i];
    }
    return min;
}

public int getMax(int []lst)
{
    int max = lst[0];
    for(int i=0;i<lst.length;i++)
    {
        if(max<lst[i])
        max=lst[i];
    }
    return max;
}

public int getMedian(int [] lst)
{
    Arrays.sort(lst);
    int middle = lst.length/2;
    if(lst.length%2==1)
    {
        return lst[middle];
    }
    return (lst[middle-1] + lst[middle]);
}

public int getMean(int [] lst)
{
    Arrays.sort(lst);
    int mean = 0;
    int sum = 0;
    int count = 0;
    for(int i=0;i>lst.length;i++)
    {
        sum = sum + lst[i];
        count++;
    }
    mean = sum/count;
    return mean;
}

public int getStandardDev(int [] lst, int m)
{
    int mean = m;
    int [] array = lst;
    int total = 0;
    for(int i =0; i < array.length; i++)
    {
        int result = array[i]-mean;
        int [] all = Math.pow(result, 2);

    }
    total = result/array.length;
    int standev = Math.sqrt(total);
    return standev;
}

}

Мои конкретные проблемы сводятся к следующему: я не знаю, правильно ли я читаю в файле. Я следовал многим инструкциям от книг до веб-сайта, и это, кажется, правильная формула для сканера, но файл не найден. Я пробовал три разных IDE (BlueJ, Eclipse, Netbeans), но безрезультатно.

Во-вторых, я создал методы для получения массива в качестве входных данных и вызвал их в методе public void main (string [] args). Я почти уверен, что смогу сделать это, но он не скомпилируется, и я не уверен, что мне не хватает.

Наконец, я хочу убедиться, что мой метод стандартного отклонения правильный. Я не ожидаю, что кто-нибудь решит все эти проблемы, но это те моменты, в которых я застрял, и любая помощь будет оценена. Спасибо!

Ответы [ 4 ]

3 голосов
/ 07 сентября 2011

Первое, что нужно сделать, это заставить вашу программу компилироваться и запускаться (правильно или нет). Затем вы можете просто напечатать значения, которые он читает, и проверить, идентичны ли они значениям в файле данных.

Чтобы запустить вашу программу, сначала нужно объявить метод main () равным static. Кроме того, поскольку вы перехватываете IOException (кстати, хорошая идея!), Вам не нужно объявлять main, чтобы вызвать исключение. Наконец, поскольку вы пытаетесь прочитать данные внутри main, вы не можете получить доступ к полю scores, поскольку это переменная экземпляра и у вас еще нет экземпляра DescriptiveStats. Кроме того, поскольку вы передаете массив в качестве параметра функциям анализа, он не должен быть переменной экземпляра. Попробуйте вместо этого:

public static void main(String[] args) {
    List<Integer> scores = new ArrayList<Integer>();
    try{
        Scanner sc = new Scanner(new FileReader("students.txt"));
        while(sc.hasNextInt())
        {
            scores.add(sc.nextInt());
        }
        sc.close();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    // etc.
}
0 голосов
/ 08 сентября 2011

Хорошо, поэтому я внес некоторые изменения в соответствии с тем, что предлагали люди.Я покончил с жестко закодированным файлом и заменил его стандартным вводом.Теперь моя реальная цель - убедиться, что я правильно использую списки массивов в сочетании с методами, - убедиться, что я правильно могу применить их к стандартному отклонению. Вот мой новый код:

import java.io.*;
import java.util.*;
/**
 * Read from a standard input a series of exam scores,    
 * then compute the min, max, avg, med, & stand deviation.
 */
public class DescriptiveStats
{

public DescriptiveStats()
{
    // default constructor
}


public static void main(String[] args) throws IOException
{
    ArrayList<Integer> scores = new ArrayList<Integer>();
    try{
        Scanner input = new Scanner(System.in);
        while(input.hasNextInt())
        {
            scores.add(input.nextInt());
        }
        input.close();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }

    DescriptiveStats stat = new DescriptiveStats();
    System.out.println("Min = " + stat.getMin(scores));
    System.out.println("Max = " + stat.getMax(scores));
    System.out.println("Median = " + stat.getMedian(scores));
    System.out.println("Mean = " + stat.getMean(scores));
    int Mean = stat.getMean(scores);
    //System.out.println("Standard Deviation = " + stat.getStandardDev(scores, Mean));
}


public int getMin(ArrayList<Integer> lst)
{
    int min = 0;
    int d = 0;
    for(int i=0;i<lst.size();i++)
    {                         
        d = lst.get(i);
        if(min>d)
        {
            min=d;
        }
    }
    return min;
}

public int getMax(ArrayList<Integer> lst)
{
    int max = lst.get(0);
    for(int i=0;i<lst.size();i++)
    {
        if(max<lst.get(i))
        max=lst.get(i);
    }
    return max;
}

public int getMedian(ArrayList<Integer> lst)
{
    Collections.sort(lst);
    int middle = lst.size()/2;
    if(lst.size()%2==1)
    {
        return lst.get(middle);
    }
    return (lst.get(middle-1) + lst.get(middle));
}


public int getMean(ArrayList<Integer> lst)
{
    Collections.sort(lst);
    int mean = 0;
    int sum = 0;
    int count = 0;
    for(int i=0;i>lst.size();i++)
    {
        sum = sum + lst.get(i);
        count++;
    }
    mean = sum/count;
    return mean;
}
/**
public int getStandardDev(ArrayList lst, int m)
{
    int mean = m;
    int [] array = lst;
    int total = 0;
    for(int i =0; i < array.length; i++)
    {
        int result = array[i]-mean;
        int [] all = Math.pow(result, 2);

    }
    total = result/array.length;
    int standev = Math.sqrt(total);
    return standev;
}**/

}

Как видите, метод стандартного отклонения и его ссылка в методе main включены в комментарии.Я еще не пытался преобразовать их в списки массивов, так как не уверен, что поступил правильно с остальными.

Наконец, когда я запускаю то, что имею, компилятор не возвращает ничегоошибки.Вместо этого он просто зависает, вероятно, разбился.Я не уверен почему.Когда я использую опцию «void main (String [] args» в BlueJ), я отправляю имя текстового файла (который находится в каталоге проекта. В главном каталоге даже один файл на тот случай, если на него ссылаются.

Спасибо всем.

0 голосов
/ 07 сентября 2011

Где вы разместили файл "Students'txt".Если он не находится в том же месте, что и класс "DescriptiveStats", JVM не сможет найти файл.Поэтому убедитесь, что файл находится в том же пути, что и класс, или укажите правильный путь, если вы хотите взять его откуда-то еще.

Переход ко второй точке.Вы можете абсолютно вызвать эти методы из функции main ().Какую ошибку компилятора вы получаете?

Цените ваши усилия в работе с различными IDE.Но это не имеет ничего общего с IDE.

0 голосов
/ 07 сентября 2011

Если вы хотите узнать, откуда программа пытается прочитать файл, используйте это:

File students = new File("students.txt");
System.out.println("Reading data from :" + students.getAbsolutePath());
Scanner sc = new Scanner(new FileReader(students));
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...