- Napisz program, który pobierze od użytkownika nazwę pliku, w którym znajdują się temperatury z obserwowanego tygodnia zapisane następująco:
poniedziałek 28
wtorek 23
środa 24
czwartek 26
piątek 20
sobota 18
niedziela 19
Done.
Poniższy kod pobiera nazwę pliku, a następnie weryfikuje, czy zawartość tego pliku jest dokładnie taka, jak podana w treści zadania.
Jeśli jego zawartość jest taka, jak w treści - pobiera / zwraca tę nazwę, w przeciwnym wypadku jej nie pobiera / zwraca.
Tutaj przyjąłem uproszczenie, że użytkownik będzie komunikował się z aplikacją za pośrednictwem konsoli (stdin, stdout), ale można to ubrać w jeden poziom abstrakcji wyżej i komunikować się z użytkownikiem w zależności od wymagań.
public class Main {
private static final String[] temperaturyZObserwowanegoTygodnia = {
"poniedziałek 28",
"wtorek 23",
"środa 24",
"czwartek 26",
"piątek 20",
"sobota 18",
"niedziela 19"
};
public static void main(String... args) {
final var weryfikacjaCzyWplikuZnajdujaSieTemperaturyZObserwowanegoTygodnia =
new WeryfikacjaCzyWplikuZnajdujaSieTemperaturyZObserwowanegoTygodnia(
temperaturyZObserwowanegoTygodnia
);
final var pobieraczNazwyPlikuWKtormyZnajdujaSieTemperaturyZObserwowanegoTygodnia =
new PobieraczNazwyPlikuWKtormyZnajdujaSieTemperaturyZObserwowanegoTygodnia(
new Scanner(System.in), System.out, temperaturyZObserwowanegoTygodnia,
weryfikacjaCzyWplikuZnajdujaSieTemperaturyZObserwowanegoTygodnia);
final var nazwaPlikuWKtorymZnajdujaSieTemperaturyZObserwowanegoTygodnia =
pobieraczNazwyPlikuWKtormyZnajdujaSieTemperaturyZObserwowanegoTygodnia.pobierz();
nazwaPlikuWKtorymZnajdujaSieTemperaturyZObserwowanegoTygodnia
.ifPresentOrElse(nazwa -> System.out.println("Pobrano nazwę pliku: " + nazwa),
() -> System.out.println("Nie udało się pobrać nazwy pliku."));
}
static class PobieraczNazwyPlikuWKtormyZnajdujaSieTemperaturyZObserwowanegoTygodnia {
private final Scanner in;
private final PrintStream out;
private final String[] temperaturyZObserwowanegoTygodnia;
private final WeryfikacjaCzyWplikuZnajdujaSieTemperaturyZObserwowanegoTygodnia weryfikacjaCzyWplikuZnajdujaSieTemperaturyZObserwowanegoTygodnia;
PobieraczNazwyPlikuWKtormyZnajdujaSieTemperaturyZObserwowanegoTygodnia(Scanner in,
PrintStream out,
String[] temperaturyZObserwowanegoTygodnia,
WeryfikacjaCzyWplikuZnajdujaSieTemperaturyZObserwowanegoTygodnia weryfikacjaCzyWplikuZnajdujaSieTemperaturyZObserwowanegoTygodnia) {
this.in = in;
this.out = out;
this.temperaturyZObserwowanegoTygodnia = temperaturyZObserwowanegoTygodnia;
this.weryfikacjaCzyWplikuZnajdujaSieTemperaturyZObserwowanegoTygodnia = weryfikacjaCzyWplikuZnajdujaSieTemperaturyZObserwowanegoTygodnia;
}
Optional<String> pobierz() {
printCommand();
final var nazwaPlikuWKtorymPowinnyZnajdowacSieTemperaturyZObserwowanegoTygodnia = readLine();
return weryfikujCzyWPlikuZnadujaSieTemperaturyZObserwowanegoTygodnia(
nazwaPlikuWKtorymPowinnyZnajdowacSieTemperaturyZObserwowanegoTygodnia);
}
private Optional<String> weryfikujCzyWPlikuZnadujaSieTemperaturyZObserwowanegoTygodnia(
String nazwaPlikuWKtorymPowinnyZnajdowacSieTemperaturyZObserwowanegoTygodnia) {
try {
final var zweryfikowano = weryfikacjaCzyWplikuZnajdujaSieTemperaturyZObserwowanegoTygodnia
.weryfikujCzyWPlikuZnajdujaSieTemperaturyZObserwowanegoTygodnia(
nazwaPlikuWKtorymPowinnyZnajdowacSieTemperaturyZObserwowanegoTygodnia);
return zweryfikowano
? Optional.of(nazwaPlikuWKtorymPowinnyZnajdowacSieTemperaturyZObserwowanegoTygodnia)
: Optional.empty();
} catch (IOException e) {
return Optional.empty();
}
}
private String readLine() {
final var potencjalnieNazwaPlikuWKtorymPowinnyZnajdowacSieTemperaturyZObserwowanegoTygodnia =
in.nextLine();
if (potencjalnieNazwaPlikuWKtorymPowinnyZnajdowacSieTemperaturyZObserwowanegoTygodnia
.isBlank()) {
out.println("Nazwa pliku nie może być pusta.");
printCommand();
return readLine();
}
return potencjalnieNazwaPlikuWKtorymPowinnyZnajdowacSieTemperaturyZObserwowanegoTygodnia;
}
private void printCommand() {
out.println(
"Podaj nazwę pliku, w którym znajdują się temperatury z obserwowanego tygodnia zapisane następująco:");
printTemperatura();
}
private void printTemperatura() {
for (String temperatura : temperaturyZObserwowanegoTygodnia) {
out.println(temperatura);
}
}
}
static class WeryfikacjaCzyWplikuZnajdujaSieTemperaturyZObserwowanegoTygodnia {
private final String[] temperaturyZObserwowanegoTygodnia;
WeryfikacjaCzyWplikuZnajdujaSieTemperaturyZObserwowanegoTygodnia(
String[] temperaturyZObserwowanegoTygodnia) {
this.temperaturyZObserwowanegoTygodnia = temperaturyZObserwowanegoTygodnia;
}
boolean weryfikujCzyWPlikuZnajdujaSieTemperaturyZObserwowanegoTygodnia(
String nazwaPlikuWKtorymPowinnyZnajdowacSieTemperaturyZObserwowanegoTygodnia)
throws IOException {
final var liniePlikuWKtorymPowinnyZnajdowacSieTemperaturyZObserwowanegoTygodnia = Files.lines(
new File(nazwaPlikuWKtorymPowinnyZnajdowacSieTemperaturyZObserwowanegoTygodnia).toPath())
.limit(temperaturyZObserwowanegoTygodnia.length
+ 1) // zeby sprawdzic, czy plik nie ma przypadkiem wiecej linii
.toArray(String[]::new);
if (liniePlikuWKtorymPowinnyZnajdowacSieTemperaturyZObserwowanegoTygodnia.length
!= temperaturyZObserwowanegoTygodnia.length) {
return false;
}
return IntStream.range(0, temperaturyZObserwowanegoTygodnia.length)
.filter(i -> temperaturyZObserwowanegoTygodnia[i]
.equals(liniePlikuWKtorymPowinnyZnajdowacSieTemperaturyZObserwowanegoTygodnia[i]))
.count() == temperaturyZObserwowanegoTygodnia.length;
}
}
}