Как я могу получить общее количество месяцев в моем новом файле? - PullRequest
0 голосов
/ 12 мая 2019

В настоящее время я работаю над C из этого варианта 3: Загрузить статистику

Если пользователь выберет эту опцию, программа создаст файл статистики со следующими данными:

a.  Power output sorted from lowest to highest
b.  Day with highest output 
c.  Total by month 
d.  Average power output for all the data

Файл статистики будет иметь то же имя, что и входной файл, но с добавленным _stats.txt.Например, если входной файл был назван data.txt, файл статистики будет называться data_stats.txt.

Мой файл данных содержит

January 10 2018 236.9
January 11 2018 267.6
January 12 2018 278.1
January 13 2018 246.9
January 14 2018 262.3
January 15 2018 288.6
February 2 2018 199.7
February 3 2018 134.6
February 4 2018 200.8
February 5 2018 198.2
March 9 2018 169.7
March 10 2018 168.3
March 11 2018 179.4

Когда я запускаю C, моя общая мощность составляет 288,6, как мне получить сумму каждого месяца?

 public static void createStatsFile(ArrayList<Entry> uploadResults) {
    ///////////////
    ///////A///////
    ///////////////
    try {
        PrintWriter writer = new PrintWriter("data_stat.txt", "UTF-8");

        ArrayList<Entry> lowestToHighest = bubbleSort(uploadResults);

        for(Entry entry : lowestToHighest) {
            writer.print(
                    "Month: " + entry.getMonth() + " Day: " + entry.getDay() + " Year: " + entry.getYear() + " Power Output: " + entry.getPowerOutput());
            writer.print("\n");
            entry.print();
        }

        ///////////////
        ///////B///////
        ///////////////
        Entry tmpEntry = null;

        for(Entry entry : uploadResults) {
            if(tmpEntry == null) {
                tmpEntry = entry;
            } else {
                if(entry.getPowerOutput() > tmpEntry.getPowerOutput()) {
                    tmpEntry = entry;
                }
            }
        }

        writer.write("Day of Max Power Outage: " + tmpEntry.getMonth() + " " + tmpEntry.getPowerOutput());

        ///////////////
        ///////C///////
        ///////////////

        //ArrayList<Entry> totalByMonth = bubbleSort(uploadResults);
        Entry tempEntry = null;
        for(Entry entry: uploadResults) {
            float sum;
            sum =entry.getPowerOutput();
        }

        writer.write("Total power output by month: " + tmpEntry.getMonthList() + " " + tmpEntry.getPowerOutput());
        writer.close();

Мой класс:

public class Entry {
    //declaring variables
    private String month;
    private String day;
    private String year;
    private float powerOutput;
    private String file;
    private int[] MonthList;
    String inputFile = file;

    //Constructors
    public Entry() {
    }

    public Entry(String m, String d, String y, float p) {
        month = m;
        day = d;
        year = y;
        powerOutput = p;
    }

    //creating print to call ArrayList in main
    public void print() {
        System.out.println("Month: " + month + " Day: " + day + " Year: " + year + " Power Output: " + powerOutput);
    }

    public static void getFile() {

    }

    public String getMonth() {
        return month;
    }

    public String getDay() {
        return day;
    }

    public String getYear() {
        return year;
    }

    public float getPowerOutput() {
        return powerOutput;
    }

    public int[] getMonthList() {
        return MonthList;
    }

    public String getInputFile() {
        return inputFile;
    }
}    

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Вы можете использовать потоки, чтобы получить карту требуемых результатов.

 Map<String, Double> collect = uploadResults.stream().collect(
            Collectors.groupingBy(Entry::getMonth, Collectors.summingDouble(Entry::getPowerOutput)));

Рабочая

List<Entry> uploadResults = Arrays.asList(
        new Entry("January","10","2018",236.9f),
        new Entry("January","11","2018",267.6f),
        new Entry("January","12","2018",278.1f),
        new Entry("January","13","2018",246.9f),
        new Entry("January","14","2018",262.3f),
        new Entry("January","15","2018",288.6f),
        new Entry("February","2","2018",199.7f),
        new Entry("February","3","2018",134.6f),
        new Entry("February","4","2018",200.8f),
        new Entry("February","5","2018",198.2f),
        new Entry("March","9","2018",169.7f),
        new Entry("March","10","2018",168.3f),
        new Entry("March","11","2018",179.4f)
);

Map<String, Double> collect = uploadResults.stream().collect(
        Collectors.groupingBy(Entry::getMonth, Collectors.summingDouble(Entry::getPowerOutput)));

System.out.println(collect);

выход

{March=517.3999938964844, February=733.3000030517578, January=1580.3999938964844}

EDIT:

Для версий ниже Java8 это должно сделать

Map<String, Float> monthMap = new HashMap<>();
for (Entry uploadResult : uploadResults) {
    String month = uploadResult.getMonth();
    Float powerOutput = uploadResult.getPowerOutput();

    if( monthMap.containsKey(month) ){
        powerOutput += monthMap.get(month);
    }
    monthMap.put( month, powerOutput);
}
System.out.println(monthMap);
1 голос
/ 12 мая 2019

Здесь вы инициализируете свою сумму в каждом цикле.

    Entry tempEntry = null;
    for(Entry entry: uploadResults) {
        float sum;
        sum =entry.getPowerOutput();
    }

Переместите float sum; перед суммой и добавьте к сумме:

    Entry tempEntry = null;
    float sum = 0;
    for(Entry entry: uploadResults) {
        sum += entry.getPowerOutput();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...