Карта уменьшить с потоком Java 8 - PullRequest
0 голосов
/ 07 октября 2018

для назначения класса, я должен использовать поток java 8, чтобы эмулировать уменьшение карты, но у меня много трудностей, чтобы его запустить.Может ли кто-нибудь помочь мне с картированием (первый шаг)?это весь код, который я получил до сих пор: WeatherStationsQ2.java

package assignmnent2;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class WeatherStationQ2 {

    //Setting up class attributes
    private String city;
    private List<MeasurementQ2> measurements;
    public static List<WeatherStationQ2> stations= new ArrayList<>();


    //Setting up constructor for the WeatherStationQ1 object
    public WeatherStationQ2(String city, List<MeasurementQ2> measurements/*,List<String> stations*/){
        this.city = city;
        this.measurements = measurements;
    }

    //Setting up the setters and getters for the attributes of the object WeatherStationQ1
    public void setCity(String city){
        this.city = city;
    }

    public String getCity(){
        return city;        
    }

    public void setMeasurements(List<MeasurementQ2> measurements){
        this.measurements = measurements;
    }

    public List<MeasurementQ2> getMeasurements(){
        return measurements;
    }

    //MaxTemperature function to return highest temperature of a given time range
    public void maxTemperature(int startTime, int endTime){

        //Creates a list of the MeasurementQ2 object in the selected time range
        List<MeasurementQ2> tempList = this.getMeasurements().stream().filter(e -> e.getTime()>=startTime)
                .filter(e -> e.getTime()<=endTime).collect(Collectors.toList());

        //Finding the MeasurementQ2 with the higher temperature in the filtered list
        MeasurementQ2 maxMe = tempList.stream().max(Comparator.comparing(MeasurementQ2::getTemperature))
                  .orElseThrow(NoSuchElementException::new);

        //Display results
        System.out.println("The maximum temperature was: "+maxMe.getTemperature()+" and it happen at time: "+maxMe.getTime());
    }

    public static void countTemperature(double t1, double t2, int r){
        Stream<List<WeatherStationQ2>> st = Arrays.asList(stations).stream();
        Map<Integer, Double> map = st
        //List <MeasurementQ2> map =  (List<MeasurementQ2>) stations.parallelStream().map(WeatherStationQ2::getMeasurements);
        //Map <Integer, Double> map = stations.parallelStream().collect(Collectors.groupingBy(MeasurementQ2::getTime, MeasurementQ2::getTemperature));
        /*Stream<List<WeatherStationQ2>> st  = Arrays.asList(stations).stream();
        Stream<List<WeatherStationQ2>> map = st.map(s -> s);*/

        st.forEach(s->System.out.println(s));
    }

    public static void main(String Args[]){
        //Creates a series of MeasurementQ1 object, creates a list and populate the list
        MeasurementQ2 m = new MeasurementQ2(1, 2.0);
        MeasurementQ2 n = new MeasurementQ2(13, 8.1);
        MeasurementQ2 o = new MeasurementQ2(25, 12.5);
        List<MeasurementQ2> mesearements = new ArrayList<>();
        mesearements.add(m);
        mesearements.add(n);
        mesearements.add(o);
        MeasurementQ2 p = new MeasurementQ2(3, 23.6);
        MeasurementQ2 q = new MeasurementQ2(11, 13.8);
        MeasurementQ2 r = new MeasurementQ2(28, 14.5);
        List<MeasurementQ2> measure = new ArrayList<>();
        measure.add(p);
        measure.add(q);
        measure.add(r);

        //Creates the WeatherStationQ1 object
        WeatherStationQ2 WS = new WeatherStationQ2("Galway", mesearements);
        WeatherStationQ2 WS2 = new WeatherStationQ2("Dublin", measure);

        stations.add(WS);
        stations.add(WS2);
        WS.maxTemperature(1, 30);// Applying the maxTemperature method
        WS2.maxTemperature(1, 30);

        countTemperature(19.0,10.8,3);
    }
}

MeasurementQ2.java

   package assignmnent2;

public class MeasurementQ2 {

    //Setting up class attributes
    private int time;
    private double temperature;

    //Setting up constructor for the MeasurementQ1 object
    public MeasurementQ2(int time, double temperature){
        this.time = time;
        this.temperature=temperature;
    }

    //Setting up the setters and getters for the attributes of the object MeasurementQ1
    public void setTime(int time){
        this.time=time;
    }

    public int getTime(){
        return time;        
    }

    public void setTemperature(double temperature){
        this.temperature = temperature;
    }

    public double getTemperature(){
        return temperature;
    }
    @Override
    public String toString() {
        return this.getTime() + " " + this.getTemperature();
    }
}

Описание задания: Вопрос 1 [40 баллов] Создайте класс WeatherStation с тремяатрибуты (поля): город, в котором расположена станция, измерения станции (список объектов класса Measurement) и статические полевые станции (список всех существующих метеостанций).Также создайте класс Measurement.Объекты класса Measurement должны иметь атрибуты time (целое число) и температуры (двойное число).Добавьте к этому классу метод maxTempera (startTime, endTime), который возвращает максимальную температуру, измеренную метеостанцией между startTime и endTime.ЭТА ЧАСТЬ СДЕЛАНА

Вопрос 2 [60 баллов] Добавьте метод countTemperas (t1, t2, r) в ваш класс WeatherStation из предыдущего вопроса.Метод должен возвращать список, который содержит две пары: 1) температура t1 в паре с количеством раз, когда температура в интервале [t1-r..t1 + r] была измерена какой-либо из метеостанций на станциях,и 2) температура t2 в паре с количеством раз, когда температура в интервале [t2-r..t2 + r] измерялась какой-либо из метеостанций на станциях.Для вычисления результата вам нужно использовать «эмулированный» подход MapReduce.То есть ваш код должен напоминать подход MapReduce, но с использованием только Java> = 8 (без кластера машин и без какой-либо программной среды MapReduce).Кроме того, вам необходимо использовать потоки Java 8 (насколько это возможно) и параллельную обработку потоков (при необходимости).Наконец, добавьте код в ваш метод main, который вызывает ваш метод countTemperas, используя несколько тестовых станций и некоторые данные тестовых измерений, и печатает результат.

Вопрос 1 выполнен, но я наткнулся на вопрос 2

1 Ответ

0 голосов
/ 07 октября 2018

Вы можете использовать приведенный ниже фрагмент кода для всех станций, чтобы получить счет

    long count = this.getMeasurements()
        .stream()
        .filter(e -> Math.abs(e.getTime() - t1) <= r)
        .count();

РЕДАКТИРОВАТЬ

public static void countTemperature(double t1, double t2, int r) {
    stations.stream()
            .map(station ->
                    station.getMeasurements()
                            .stream()
                            .filter(e -> Math.abs(e.getTime() - t1) <= r)
                            .count()
            )
            .forEach(System.out::println);
}

При следующем вызове:

countTemperature(19.0, 10.8, 8);

Это вывод:

The maximum temperature was: 12.5 and it happen at time: 25
The maximum temperature was: 23.6 and it happen at time: 3
2
1
...