Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Expand
titleDel 3 - Delegering (10 %)

Følgende vedlagte klasser/interfaces brukes, men skal ikke endres i denne oppgaven. Du trenger ikke forstå hvordan metodene er implementert, bare benytte deg direkte av de.

  • SomeServiceImpl - Implementasjon av SomeService.
  • SomeService - Grensesnitt som implementers i både SomeServiceImpl og LoggingSomeService.
  • Logger - En hjelpeklasse for å logge resultater.

Du skal fylle ut LoggingSomeService og metodene/konstruktør i denne klassen. LoggingSomeService skal delegere videre til en delegat, som skal utføre arbeidet, og deretter logge resultatet før det returneres. Følgende metoder skal implementeres:

  • LoggingSomeService(SomeService delegate, Logger logger) - Oppretter et objekt av LoggingSomeService med en delegat og en logger.
  • getAMagicString() - Returnerer en magisk String. Det er den delegertes oppgave å hente ut Stringen, og den skal logges før det returneres.
  • getAMagicNumber() - Returnerer et magisk tall. Det er den delegertes oppgave å hente ut tallet, og det skal logges før det returneres.
Expand
titleKodesskjelett del 3


Code Block
languagejava
public interface SomeService {

	public String getAMagicString();

	public int getAMagicNumber();
}


public class Logger {

	// This is only for testing
	Collection<String> hasLogged = new ArrayList<>();

	public void log(String log) {
		System.out.println(log);
		hasLogged.add(log);
	}
}
public class SomeServiceImpl implements SomeService {

	@Override
	public String getAMagicString() {
		return "magic";
	}

	@Override
	public int getAMagicNumber() {
		return 42;
	}

}


public class LoggingSomeService implements SomeService {

	// Add needed fields here

	/*
	 * Creates a LoggingSomeService object with the given delegate and logger
	 */
	public LoggingSomeService(SomeService delegate, Logger logger) {
		...
	}

	@Override
	/**
	 * Delegates the job of calculating a magic string to the delegate, and logs the
	 * result before returning it
	 * 
	 * @return A string
	 */
	public String getAMagicString() {
		...
	}

	/**
	 * Delegates the job of calculating a magic number to the delegate, and logs the
	 * result before returning it
	 * 
	 * @return An integer
	 */
	@Override
	public int getAMagicNumber() {
		...
	}
}




Expand
titleLF


Code Block
languagejava
public interface SomeService {

	public String getAMagicString();

	public int getAMagicNumber();
}

import java.util.ArrayList;
import java.util.Collection;

public class Logger {

	// This is only for testing
	Collection<String> hasLogged = new ArrayList<>();

	public void log(String log) {
		System.out.println(log);
		hasLogged.add(log);
	}
}
public class SomeServiceImpl implements SomeService {

	@Override
	public String getAMagicString() {
		return "magic";
	}

	@Override
	public int getAMagicNumber() {
		return 42;
	}

}
public class LoggingSomeService implements SomeService {

	// Add needed fields here
	private SomeService delegate;
	private Logger logger;
	/*
	 * Creates a LoggingSomeService object with the given delegate and logger
	 */
	public LoggingSomeService(SomeService delegate, Logger logger) {
		this.delegate = delegate;
		this.logger = logger;
	
	}

	@Override
	/**
	 * Delegates the job of calculating a magic string to the delegate, and logs the
	 * result before returning it
	 * 
	 * @return A string
	 */
	public String getAMagicString() {
		String magic = delegate.getAMagicString();
		logger.log(magic);
		return magic;
	}

	/**
	 * Delegates the job of calculating a magic number to the delegate, and logs the
	 * result before returning it
	 * 
	 * @return An integer
	 */
	@Override
	public int getAMagicNumber() {
		int magicNumber = delegate.getAMagicNumber();
		logger.log(Integer.toString(magicNumber));
		return magicNumber;
	}
}





Del 4 - Interfaces og Comparators (15 %)
Expand
titleDel 4 - Interfaces og Comparators (15 %)

Fyll inn vedlagte AthleteComparators og de to metodene der. Du skal ta utgangspunkt i, men ikke trenge å endre Athlete og Medal som ligger vedlagt.

Det er tillatt å legge til metoder i disse klassene dersom du mener det er hjelpemetoder som vil være til hjelp. Ingen ekstra metoder du legger til bør endre tilstanden til objektene.

Følgende metoder skal implementeres:

  • getSimpleComparator() - Returner en comparator som skal brukes til å sammenlikne Athletes basert på navnet deres alfabetisk. Det vil si at Ane kommer før Berit, som igjen kommer før Daniel.
  • getAdvancedComparator Returner en comparator som skal brukes til å sammenlikne Athletes basert på antall medaljer de har. En atlet som har to gullmedaljer, vil komme før en atlet som har en gullmedalje og en sølvmedalje. Dersom de har likt antall medaljer av en type går man videre til neste medaljetype, og hvis de har likt antall medaljer av alle typer skal man sammenlikne basert på navnet som i getSimpleComparator.
Expand
titleSkjelett til del 3


Code Block
languagejava
import java.util.ArrayList;
import java.util.List;

public class Athlete {
	
	private List<Medal> medals = new ArrayList<Medal>();
	private String country;
	private String name;

	public Athlete(String country, String name, List<Medal> medals) {
		this.name = name;
		this.country = country;
		this.medals = new ArrayList<>(medals);
	}

	public List<Medal> getMedals() {
		return new ArrayList<>(medals);
	}

	public String getCountry() {
		return country;
	}

	public String getName() {
		return name;
	}

}
import java.util.Arrays;
import java.util.List;

public class Medal {
	
	private String metal;
	public static List<String> validMetals = Arrays.asList("Gold", "Silver", "Bronze");

	public Medal(String metal) {
		if (!validMetals.contains(metal)) {
			throw new IllegalArgumentException("Invalid medal");
		}
		this.metal = metal;
	}

	public String getMetal() {
		return metal;
	}
}


public class AthleteComparators {

	/**
	 * @return a comparator that compares athletes based on their name. Using this
	 *          comparator, Ane should come before Berit
	 */
	public static Comparator<Athlete> getSimpleComparator() {
		...
	}

	/**
	 * @return A comparator that compares athletes based on the number of medals of
	 *          different valour. The comparator will be used for sorting athletes
	 *          based on putting the athlete with the highest number of medals of the best valour
	 *          first.
	 * 
	 *          If one athlete has more "Gold" medals than the other athlete it
	 *          should come before that one. If they have equal number of "Gold"
	 *          medals they should be compared on the number of "Silver" medals, and
	 *          if that is equal on the number of "Bronze" medals. If they have the
	 *          same number of medals of all valour, they should be compared based
	 *          on the name similar to getSimpleComparator
	 *          
	 *          The spelling and order of the medals can be seen in the list validMetals in the Medal class. 
	 */
	public static Comparator<Athlete> getAdvancedComparator() {
		...
	}
}



Expand
titleLF


Code Block
languagejava
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class AthleteComparators {

	/**
	 * @return a comparator that compares athletes based on their name. Using this
	 *          comparator, Ane should come before Berit
	 */
	public static Comparator<Athlete> getSimpleComparator() {
		return new Comparator<Athlete>() {
			public int compare(Athlete a, Athlete b) {
				return a.getName().compareTo(b.getName());
			}
		};
	}

	/**
	 * @return A comparator that compares athletes based on the number of medals of
	 *          different valour. The comparator will be used for sorting athletes
	 *          based on putting the athlete with the highest number of medals of the best valour
	 *          first.
	 * 
	 *          If one athlete has more "Gold" medals than the other athlete it
	 *          should come before that one. If they have equal number of "Gold"
	 *          medals they should be compared on the number of "Silver" medals, and
	 *          if that is equal on the number of "Bronze" medals. If they have the
	 *          same number of medals of all valour, they should be compared based
	 *          on the name similar to getSimpleComparator
	 *          
	 *          The spelling and order of the medals can be seen in the list validMetals in the Medal class. 
	 */
	public static Comparator<Athlete> getAdvancedComparator() {
		return new Comparator<Athlete>() {
			public int compare(Athlete a, Athlete b) {

				for (String metal : Medal.validMetals) {
					int numberOfMedalsA = (int) a.getMedals().stream().filter(medal -> medal.getMetal().equals(metal))
							.count();
					int numberOfMedalsB = (int) b.getMedals().stream().filter(medal -> medal.getMetal().equals(metal))
							.count();
					if (numberOfMedalsA != numberOfMedalsB) {
						return numberOfMedalsB - numberOfMedalsA;
					}
				}
				return a.getName().compareTo(b.getName());
			}
		};
	}
}
Expand
title





Expand
titleDel 5 - Observatør-Observert (20 %)


...