JAVA 02 (p) - funkcje i kolekcje /updated 13.03/

JAVA 02 (p) - funkcje i kolekcje /updated 13.03/
ukryj menu
SPEC
aktualizacja: 2022-03-13 20:59:44


1. funkcje - opis

W poniższych przykładach widać, że funkcje są napisane w obrębie klasy Test

W Javie nie ma możliwości pisania funkcji poza klasami, ponieważ została ona zaprojektowana jako OOP (Object Oriented Programming) i funkcje mają służyć do operowania na obiektach klas, o czym dokładniej na kolejnych zajęciach.

Funkcje zwracają odpowiedni typ danych (String, int, double), lub nic nie zwracają (void) czyli wykonują jakieś działanie
Można do nich przekazać argumenty odpowiednich typów rozdzielone przecinkami
Modyfikator static w poniższych przykładach oznacza, że funkcję można wywołać bez tworzenia obiektu klasy w której się znajduje, czyli klasy Test.
Ciało funkcji jest zamknięte w nawiasach klamrowych {}


przykład kilku funkcji

class Test {
    public static void main(String[] args) {
        System.out.println(isBigger(4));
        System.out.println(isBigger(110));
        System.out.println(printString());
        System.out.println(rectArea(2,4));
        makeSomething();
        makeSomething2();

    }

    static boolean isBigger(int x) {
        return x > 100;
    }

    static int rectArea(int a, int b){
        return a * b;
    }

    static String printString(){
        return "any string";
    }

    static void makeSomething() {
        System.out.println("makeSomething");
    }

    static void makeSomething2() {
        System.out.println("makeSomething2");
    }
}
kopiuj

Uwaga ogólna: wszystkie println muszą być  w funkcjach a funkcje wywołane w main lub w innych funkcjach
Nie ma możliwości pisania kodu poza funkcjami

2. vararg... - dowolna ilość argumentów funkcji

dla nieznanej ilości argumentów jednego typu, możemy określić jeden argument vararg
Uwaga: parametr vararg może wystąpić tylko raz w danej metodzie
Uwaga: musi być ostatnim argumentem


przykład 1

static String formatSth(String... args){
   return Arrays.toString(args);
}

System.out.println(formatSth("a","b","c","d"));kopiuj


przyklad 2

static String[] formatSth2(String... args){
   return args;
}

System.out.println(Arrays.toString(formatSth2("d","e","f")));kopiuj



3. wartości domyślne argumentów

w Javie argument funkcji NIE mają domyślnych wartości

4. kolekcje

W Javie istnieje ogrom kolekcji, czyli struktur przechowujących różne typy danych
Są w pakiecie java.util, który musi być zaimportowany


Należą do nich:

- listy (list),
- zbiory (set),
- mapy (map)
- inne

Kolekcje nie mają określonego z góry rozmiaru jak tablice
Każda kolekcja ma metody takie jak add(), remove(), get(), size() i wiele innych w zależności od kolekcji
Ważne: kompilator podpowiada których można użyć w danym momencie, a których nie

5. listy

Typowym przykładem listy jest ArrayList, przechowująca dane określonego typu


przykład 1

ArrayList<String> items = new ArrayList<>();
items.add("a");
items.add("b");
items.add("c");
System.out.println(items);
System.out.println(items.get(0));kopiuj


przykład 2

ArrayList<Integer> items2 = new ArrayList<>();
items2.add(1);
items2.add(2);
items2.add(3);
System.out.println(items2);
System.out.println(items2.get(0));kopiuj


usuwanie po indeksie

items2.remove(0);kopiuj

usuwanie wszystkich elementów listy

items2.clear();kopiuj

iteracja

for(int i = 0;i<items2.size();i++){
   System.out.println(items2.get(i));
}kopiuj



5. set - lista bez duplikatów

działanie można porównać z listami, różnica to brak duplikatów w Set

Set<String> set1 = new HashSet<>();kopiuj

dodanie danych

set1.add("a");
set1.add("b");
set1.add("c");
set1.add("a");
set1.add("a");

System.out.println(set1);kopiuj


wielkość seta

System.out.println(set1.size());kopiuj

pobranie danych, po przekształceniu na tablicę

String[] array = (String[]) set1.toArray();
System.out.println(array[0]);kopiuj


pobranie danych, po przekształceniu na arraylist

ArrayList<String> list = new ArrayList<>(set1);
System.out.println(list.get(0));kopiuj


usuwanie danych

set1.remove("a");kopiuj

union - suma dwóch setów

Set<String> set1 = new HashSet<>();
set1.add("a");
set1.add("b");

Set<String> set2 = new HashSet<>();
set2.add("a");
set2.add("e");

set1.addAll(set2);
System.out.println(set1);kopiuj

intersect - część wspólna dwóch setów

set1.retainAll(set2);kopiuj


6. map

mapy zawierają w każdym indeksie parę: klucz i wartość

Map<String, Integer> map = new HashMap<String, Integer>();kopiuj

dodanie danych

map.put("a", 100);
map.put("b", 200);
map.put("c", 300);
map.put("d", 400);
map.put("a", 200);

System.out.println(map);
System.out.println(map.get("a"));
kopiuj
    

7. sposoby inicjalizacji list od razu z wstępnymi danymi

a) list

ArrayList<String> list = new ArrayList<>() {
            {
                add("a");
                add("b");
                add("c");
            }
};
System.out.println("ArrayList : " + list);kopiuj


lub dane z tablicy

ArrayList<String> list2 = new ArrayList<>(
                Arrays.asList(
                        "a",
                        "b",
                        "c")
);


System.out.println("ArrayList : " + list2);kopiuj

lub z list

List<Integer> list = Arrays.asList(3, 6, 9, 12, 15);
System.out.println(list);kopiuj


b) set

Set<String> set1 = new HashSet<>(){
            {
                add("a");
                add("b");
                add("c");
                add("a");
            }
};

System.out.println(set1);kopiuj


c) map

Map<String, Integer> map = new HashMap<>(){
            {
                put("a", 100);
                put("b", 200);
                put("c", 300);
            }
};
System.out.println(map);kopiuj


8. iteracja po kolekcjach

a) list

tradycyjny for


ArrayList<Integer> items2 = new ArrayList<>();
items2.add(1);
items2.add(2);
items2.add(3);

for(int i = 0;i<items2.size();i++){
   System.out.println(items2.get(i));
}kopiuj


for in

for (Integer i : items2) {
   System.out.println(i);
}kopiuj



b) map

Map<String, Integer> map1 = new HashMap<>(){
            {
                put("a", 100);
                put("b", 200);
                put("c", 300);
            }
};
kopiuj




map zachowuje się jak obiekt w js, podobnie też czytamy z niego dane: klucz i wartość
poniżej trzy sposoby

for (String key : map1.keySet()) {
   System.out.println(key + ":" + map1.get(key));
}
for (Integer value : map1.values()) {
   System.out.println(value);
}
for (Map.Entry<String, Integer> entry : map1.entrySet()) {
   System.out.println(entry.getKey() + ":" + entry.getValue());
}
kopiuj

c) set


Set<String> set1 = new HashSet<>(){
            {
                add("a");
                add("b");
                add("c");
            }
};

for (String s : set1) {
   System.out.println(s);
}kopiuj


Są jeszcze niezliczone metody oparte o operator lambda, jednak zostawimy je na inna okazję


9. zadania

1. Zadanie przykładowe - napisz program, który do kolekcji ArrayList dodaje 6 różnych imion, a następnie je sortuje.
Zadaniem jest wypisywanie, które utwórz w osobnej funkcji printujListe(), przyjmującej listę jako argument

class Zadanie01 {
    public static void main(String[] args) {
        System.out.println("SORTOWANIE");
        ArrayList<String> lista = new ArrayList<>();
        lista.add("Julia");
        lista.add("Agata");
        lista.add("Zenek");
        lista.add("Jarek");
        lista.add("Kasia");
        lista.add("Dominika");
        System.out.println("Elementy nieposortowane.");
        printujListe(lista);
        Collections.sort(lista);
        System.out.println("Elementy posortowane.");
        printujListe(lista);
    }

    static void printujListe(ArrayList<String> lista){
        // uzupełnij zadanie
    }
}kopiuj




output z konsoli ma wyglądać dokładnie jak poniżej (kropka na końcu)

SORTOWANIE
Elementy nieposortowane.
Julia-Agata-Zenek-Jarek-Kasia-Dominika.

Elementy posortowane.
Agata-Dominika-Jarek-Julia-Kasia-Zenek. kopiuj




2. Napisz program, który korzystając z ArrayList, umieszcza w niej liczby od 1 do n, a następnie je sumuje.
Wypisywanie utwórz w osobnej funkcji printujListe(), przyjmującej ArrayList i n jako argumenty

output z konsoli dokładnie jak poniżej, przykład do 100

SUMOWANIE
podaj n:
5
Wszystkie elementy:
[0, 1, 2, 3, 4, 5]
Suma = 15kopiuj



3. Napisz program, który "odwraca" stringa
Nie korzystaj z żadnych wbudowanych funkcji reversed()
Utwórz własną funkcję przyjmująca stringa do odwrócenia, a zwracającą odwrócony string
Wywołaj funkcję dwukrotnie
Jeśli to możliwe, wykorzystaj kolekcje do przechowywania danych

output z konsoli dokładnie jak poniżej

ODWRACANIE
podaj dowolny ciąg znaków:
java
odwrócone:
avaj
znów odwrócone:
javakopiuj


4. Napisz program, który oblicza wynik SCRABBLE dla zadanego słowa.

Będziesz potrzebować takiej mapy:

 A, E, I, O, U, L, N, R, S, T - 1
 D, G - 2
 B, C, M, P - 3
 F, H, V, W, Y - 4
 K - 5
 J, X - 8
 Q, Z - 10


Przykład:

Słowo "javascript" powinno być ocenione na 24 punkty:

 8 punkty za J
 1 punkt za A, dwa razy
 4 punkty za V
 1 punkty dla S
 3 punkt za C
 1 punkty dla R
 1 punkty dla I
 3 punkty dla P
 1 punkty dla T


W sumie:

8 + 2 * 1 + 4 + 1 + 3 + 1 + 1 + 3 + 1 = 24


Przebieg programu:
Napisz funkcję score() która przyjmuje znak, a zwraca jego wartość
Napisz funkcję scoreWord() która przyjmuje słowo, a zwraca ilość punktów
pamiętaj, że String to tablica Char


wywołanie

public static void main(String[] args) {
    System.out.println(scoreWord("javascript"));
    System.out.println(scoreWord("java"));
}kopiuj


output z konsoli jak poniżej

SCRABBLE
javascript: 24 pkt
java: 14 pktkopiuj


5. Napisz program DIAMENT, który przyjmuje jako dane wejściowe jedną literę i wyświetla kształt rombu.
Biorąc pod uwagę literę, drukuje romb zaczynający się od "A", z dostarczoną literą w najszerszym miejscu.
Najlepiej zobaczyć przykłady działania poniżej

Wymagania

Pierwszy i ostatni wiersz zawiera jedno "A".

Wszystkie wiersze, z wyjątkiem pierwszego i ostatniego, mają dokładnie dwie identyczne litery.
Wszystkie wiersze mają tyle samo kropek na końcu, ile na początku
Diament jest symetryczny w poziomie i w pionie.
Diament ma kwadratowy kształt (szerokość równa się wysokości).
Litery tworzą kształt rombu.
W górnej połowie litery są ułożone rosnąco.
Dolna połowa zawiera litery w porządku malejącym.
Cztery rogi (zawierające kropki) to trójkąty.


Przykłady

Diament na literę "A":

Akopiuj

Diament na literę "C":

··A··
·B·B·
C···C
·B·B·
··A··kopiuj


Diament na literę "E":

····A····
···B·B···
··C···C··
·D·····D·
E·······E
·D·····D·
··C···C··
···B·B···
····A····kopiuj



wywołanie

public static void main(String[] args) {
    System.out.println(printDiament('C'));
}kopiuj



6. Napisz funkcję, która sprawdza brakujące znaki z alfabetu, w podanym stringu.
Funkcja przyjmuje stringa do analizy i zwraca stringa z brakującymi znakami
przyjmujemy, że cały alfabet to: abcdefghijklmnopqrstuvwxyz
użyj dowolnej/ych kolekcji

input: "abcdefghijklmnop"

output

"qrstuvwxyz"kopiuj

input "Nad Niemnem Elizy Orzeszkowej"

output

"bcfghpqtuvx"kopiuj

wywołanie

public static void main(String[] args) {
    System.out.println(check("abc"));
}kopiuj



7. Zaimplementuj klasyczny trójkąt Pascala

output z konsoli

podaj liczbę wierszy trójkąta:
7
rysowanie:
                        1
                    1        1
                1        2        1
            1        3        3         1
        1        4        6        4        1
    1        5        10        10        5        1
1        6        15        20        15        6        1kopiuj




sugestia:
napisz funkcję, która dostaje numer wiersza, a zwraca wiersz trójkąta w postaci ArrayList

8. Mamy listę A z liczbami całkowitymi, niektóre z nich powinny się powtarzać.

Na jej podstawie utwórz listę z wszystkimi liczbami, które występują w liście A, ale każda z nich powinna występować tylko raz.
Np: na podstawie listy [0, 2, 4, 2, 6, 7, 4, 3, 12, 6] utwórz listę [0, 2, 4, 6, 7, 3, 12].


9. Wyszukiwanie znaków

napisz program  umożliwiający wprowadzenie dowolnej liczby słów i wyszukanie ilości wystąpień zadanego znaku
program sortuje output według ilości wystąpień zadanego znaku
użyj w programie dowolnej kolekcji

output

Wprowadź literę:
a
Wprowadzaj ciągi znaków, lub napisz /koniec aby zakończyć wprowadzanie
kraków
krasnystaw
koparka
ksero
/koniec
== Ilość wystąpień: 2 ==
- krasnystaw
- koparka
== Ilość wystąpień: 1 ==
- kraków
== Ilość wystąpień: 0 ==
- kserokopiuj