дженерики
и
структуры

дженерики

Структуры данных

Динамический массив

public class DynamicArray {
    int[] data;
}
public class Main {
    public static void main(String[] args) {
        DynamicArray list = new DynamicArray();
        list.add(1);
        list.add(2);
        list.add(3);
        System.out.println(list);
    }
}

>>> [1, 2, 3]

Динамический массив

public class DynamicArray {
    int[] data;
    
    public void add(int element) {
        // тут как то должны добавляться элементы
    }    
}

Куда-то надо добавлять элементы, а массив пустой

Можно попробовать создать внутри массив ограниченного размера

Динамический массив

public class DynamicArray {
    int[] data;
    
    public void add(int element) {
        // тут как то должны добавляться элементы
    }    
}

Куда-то надо добавлять элементы, а массив пустой

Можно попробовать создать внутри массив ограниченного размера

Динамический массив

public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        // тут как то должны добавляться элементы
    }    
}

Динамический массив

public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        // положили элемент в край динамического списка
        data[size] = element; 
        // сдвинули правый край списка
        size += 1;
    }
}

Динамический массив

public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        // положили элемент в край динамического списка
        data[size] = element; 
        // сдвинули правый край списка
        size += 1;
    }
}

el1

el2

el3

el4

Динамический массив

public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        // положили элемент в край динамического списка
        data[size] = element; 
        // сдвинули правый край списка
        size += 1;
    }
}

el1

el2

el3

el4

public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        // положили элемент в край динамического списка
        data[size] = element; 
        // сдвинули правый край списка
        size += 1;
    }
}

el1

el2

el3

el4

public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        // положили элемент в край динамического списка
        data[size] = element; 
        // сдвинули правый край списка
        size += 1;
    }
}

el1

el2

el3

el4

public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        // положили элемент в край динамического списка
        data[size] = element; 
        // сдвинули правый край списка
        size += 1;
    }
}

el1

el2

el3

public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        // положили элемент в край динамического списка
        data[size] = element; 
        // сдвинули правый край списка
        size += 1;
    }
}

el1

el2

el3

public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        // чего сделать надо?
        data[size] = element;
        size += 1;
    }
}

el1

el2

el3

public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        if (size >= data.length) {
            // ...
        }
        data[size] = element;
        size += 1;
    }
}

el1

el2

el3

public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        if (size >= data.length) {
            int[] newData = new int[data.length * 2];
        }
        data[size] = element;
        size += 1;
    }
}

el1

el2

el3

public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        if (size >= data.length) {
            int[] newData = new int[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                // ...
            }
        }
        data[size] = element;
        size += 1;
    }
}

el1

el2

el3

public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        if (size >= data.length) {
            int[] newData = new int[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                newData[i] = data[i];
            }
        }
        data[size] = element;
        size += 1;
    }
}

el1

el2

el3

public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        if (size >= data.length) {
            int[] newData = new int[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                newData[i] = data[i];
            }
            // ???
        }
        data[size] = element;
        size += 1;
    }
}

el1

el2

el3

public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        if (size >= data.length) {
            int[] newData = new int[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                newData[i] = data[i];
            }
            this.data = newData;
        }
        data[size] = element;
        size += 1;
    }
}

el1

el2

el3

public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        if (size >= data.length) {
            int[] newData = new int[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                newData[i] = data[i];
            }
            this.data = newData;
        }
        data[size] = element;
        size += 1;
    }
}
public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) {
        if (size >= data.length) {
            int[] newData = new int[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                newData[i] = data[i];
            }
            this.data = newData;
        }
        data[size] = element;
        size += 1;
    }
    
    @Override
    public String toString() {
        return Arrays.toString(data);
    }    
}
public class Main {
    public static void main(String[] args) {
        // ...
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicArray list = new DynamicArray();
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicArray list = new DynamicArray();
        for (int i = 0; i < 10; ++i) {
            list.add(i);
        }        
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicArray list = new DynamicArray();
        for (int i = 0; i < 10; ++i) {
            list.add(i);
        }        
        System.out.println(list);        
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicArray list = new DynamicArray();
        for (int i = 0; i < 10; ++i) {
            list.add(i);
        }        
        System.out.println(list);        
    }
}


>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0]
public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) { /* ... */ }
    
    @Override
    public String toString() {
        return Arrays.toString(data);
    }    
}
public class Main {
    public static void main(String[] args) {
        DynamicArray list = new DynamicArray();
        for (int i = 0; i < 10; ++i) {
            list.add(i);
        }        
        System.out.println(list);        
    }
}


>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0]
public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) { /* ... */ }
    
    @Override
    public String toString() {
    	int[] subArray = Arrays.copyOfRange(data, 0, size);
        return Arrays.toString(subArray);
    }    
}
public class Main {
    public static void main(String[] args) {
        DynamicArray list = new DynamicArray();
        for (int i = 0; i < 10; ++i) {
            list.add(i);
        }        
        System.out.println(list);        
    }
}


>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0]
public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) { /* ... */ }
    
    @Override
    public String toString() {
    	int[] subArray = Arrays.copyOfRange(data, 0, size);
        return Arrays.toString(subArray);
    }    
}
public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) { /* ... */ }
    
    @Override
    public String toString() {
    	int[] subArray = Arrays.copyOfRange(data, 0, size);
        return Arrays.toString(subArray);
    }    
}
public class Main {
    public static void main(String[] args) {
        DynamicArray list = new DynamicArray();
        for (int i = 0; i < 10; ++i) {
            list.add(i);
        }
        System.out.println(list);
    }
}
public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) { /* ... */ }
    
    @Override
    public String toString() {
    	int[] subArray = Arrays.copyOfRange(data, 0, size);
        return Arrays.toString(subArray);
    }    
}
public class Main {
    public static void main(String[] args) {
        DynamicArray list = new DynamicArray();
        for (int i = 0; i < 10; ++i) {
            list.add(i);
        }
        System.out.println(list);
    }
}

>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) { /* ... */ }
    
    @Override
    public String toString() { /* ... */ }    
}
public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) { /* ... */ }
    
    @Override
    public String toString() { /* ... */ }    
    
    // метод который возвращает элемент
    public ??? at(int index) {
    	// ...
    }    
}
public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) { /* ... */ }
    
    @Override
    public String toString() { /* ... */ }    
    
    // метод который возвращает элемент
    public int at(int index) {
    	// ...
    }    
}
public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) { /* ... */ }
    
    @Override
    public String toString() { /* ... */ }    
    
    // метод который возвращает элемент
    public int at(int index) {
    	return data[index];
    }    
}
public class DynamicArray {
    int [] data = new int[3];
    int size = 0;
    
    public void add(int element) { /* ... */ }
    
    @Override
    public String toString() { /* ... */ }    
    
    // метод который возвращает элемент
    public int at(int index) {
    	if (index >= size) {
            throw new ArrayIndexOutOfBoundsException();
        }
    	return data[index];
    }    
}

Нажал Alt+Insert

public class DynamicArray {
    int[] data = new int[3];
    int size = 0;

    public int getSize() {
        return size;
    }

    public void add(int element) {
        if (size >= data.length) {
            int[] newData = new int[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                newData[i] = data[i];
            }
            this.data = newData;
        }
        data[size] = element;
        size += 1;
    }

    public int at(int index) {
        if (index >= size) {
            throw new ArrayIndexOutOfBoundsException();
        }
        return data[index];
    }

    @Override
    public String toString() {
        int[] subArray = Arrays.copyOfRange(data, 0, size);
        return Arrays.toString(subArray);
    }
}

ArrayList

public class Main {
    public static void main(String[] args) {
        DynamicArray list = new DynamicArray();
        for (int i = 0; i < 10; ++i) {
            list.add(i);
        }
        System.out.println(list);
    }
}

>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        for (int i = 0; i < 10; ++i) {
            arrayList.add(i);
        }
        System.out.println(arrayList);
    }
}

>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
public class DynamicArray {
    int[] data = new int[3];
    int size = 0;

    public void add(int element) {
        if (size >= data.length) {
            int[] newData = new int[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                newData[i] = data[i];
            }
            this.data = newData;
        }
        data[size] = element;
        size += 1;
    }

    public int at(int index) {
        if (index >= size) {
            throw new ArrayIndexOutOfBoundsException();
        }
        return data[index];
    }

    @Override
    public String toString() { /*...*/ }
    public int getSize() { return size; }
}
public class DynamicArray <T> {
    int[] data = new int[3];
    int size = 0;

    public void add(int element) {
        if (size >= data.length) {
            int[] newData = new int[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                newData[i] = data[i];
            }
            this.data = newData;
        }
        data[size] = element;
        size += 1;
    }

    public int at(int index) {
        if (index >= size) {
            throw new ArrayIndexOutOfBoundsException();
        }
        return data[index];
    }

    @Override
    public String toString() { /*...*/ }
    public int getSize() { return size; }
}
public class DynamicArray <T> {
    T[] data = new T[3];
    int size = 0;

    public void add(int element) {
        if (size >= data.length) {
            int[] newData = new int[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                newData[i] = data[i];
            }
            this.data = newData;
        }
        data[size] = element;
        size += 1;
    }

    public int at(int index) {
        if (index >= size) {
            throw new ArrayIndexOutOfBoundsException();
        }
        return data[index];
    }

    @Override
    public String toString() { /*...*/ }
    public int getSize() { return size; }
}
public class DynamicArray <T> {
    T[] data = new T[3];
    int size = 0;

    public void add(T element) {
        if (size >= data.length) {
            T[] newData = new T[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                newData[i] = data[i];
            }
            this.data = newData;
        }
        data[size] = element;
        size += 1;
    }

    public int at(int index) {
        if (index >= size) {
            throw new ArrayIndexOutOfBoundsException();
        }
        return data[index];
    }

    @Override
    public String toString() { /*...*/ }
    public int getSize() { return size; }
}
public class DynamicArray <T> {
    T[] data = new T[3];
    int size = 0;

    public void add(T element) {
        if (size >= data.length) {
            T[] newData = new T[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                newData[i] = data[i];
            }
            this.data = newData;
        }
        data[size] = element;
        size += 1;
    }

    public T at(int index) {
        if (index >= size) {
            throw new ArrayIndexOutOfBoundsException();
        }
        return data[index];
    }

    @Override
    public String toString() { /*...*/ }
    public int getSize() { return size; }
}
public class DynamicArray <T> {
    T[] data = new T[3];
    int size = 0;

    public void add(T element) {
        if (size >= data.length) {
            T[] newData = new T[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                newData[i] = data[i];
            }
            this.data = newData;
        }
        data[size] = element;
        size += 1;
    }

    public T at(int index) {
        if (index >= size) {
            throw new ArrayIndexOutOfBoundsException();
        }
        return data[index];
    }

    @Override
    public String toString() { /*...*/ }
    public int getSize() { return size; }
}
  • Нельзя вызывать  new  потому что нет гарантии что у  T  есть конструктор без параметров
  • Поэтому надо вместо T при инициализации использовать Object
  • По сути можно рассматривать Object как просто ссылку на область памяти
  • Почти все объекты в Java наследуются от Object
public class DynamicArray <T> {
    T[] data = new T[3];
    int size = 0;

    public void add(T element) {
        if (size >= data.length) {
            T[] newData = new T[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                newData[i] = data[i];
            }
            this.data = newData;
        }
        data[size] = element;
        size += 1;
    }

    public T at(int index) {
        if (index >= size) {
            throw new ArrayIndexOutOfBoundsException();
        }
        return data[index];
    }

    @Override
    public String toString() { /*...*/ }
    public int getSize() { return size; }
}
public class DynamicArray <T> {
    Object[] data = new Object[3];
    int size = 0;

    public void add(T element) {
        if (size >= data.length) {
            T[] newData = new T[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                newData[i] = data[i];
            }
            this.data = newData;
        }
        data[size] = element;
        size += 1;
    }

    public T at(int index) {
        if (index >= size) {
            throw new ArrayIndexOutOfBoundsException();
        }
        return data[index];
    }

    @Override
    public String toString() { /*...*/ }
    public int getSize() { return size; }
}
public class DynamicArray <T> {
    Object[] data = new Object[3];
    int size = 0;

    public void add(T element) {
        if (size >= data.length) {
            Object[] newData = new Object[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                newData[i] = data[i];
            }
            this.data = newData;
        }
        data[size] = element;
        size += 1;
    }

    public T at(int index) {
        if (index >= size) {
            throw new ArrayIndexOutOfBoundsException();
        }
        return data[index];
    }

    @Override
    public String toString() { /*...*/ }
    public int getSize() { return size; }
}
public class DynamicArray <T> {
    Object[] data = new Object[3];
    int size = 0;

    public void add(T element) {
        if (size >= data.length) {
            Object[] newData = new Object[data.length * 2];
            for (int i = 0; i < data.length; ++i) {
                newData[i] = data[i];
            }
            this.data = newData;
        }
        data[size] = element;
        size += 1;
    }

    public T at(int index) {
        if (index >= size) {
            throw new ArrayIndexOutOfBoundsException();
        }
        return (T) data[index];
    }

    @Override
    public String toString() { /*...*/ }
    public int getSize() { return size; }
}
public class Main {
    public static void main(String[] args) {
        DynamicArray<int> list = new DynamicArray<>();
    }
}

Нельзя использовать примитивные типы
int, boolean, double etc.

Надо использовать ссылочные типы
Integer, Boolean, Double etc.

public class Main {
    public static void main(String[] args) {
        DynamicArray<Integer> list = new DynamicArray<>();
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicArray<Integer> list = new DynamicArray<>();
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicArray<String> list = new DynamicArray<>();
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicArray<String> list = new DynamicArray<>();
        list.add("В");
        list.add("лесу");
        list.add("родилась");
        list.add("елочка");        
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicArray<String> list = new DynamicArray<>();
        list.add("В");
        list.add("лесу");
        list.add("родилась");
        list.add("елочка");        
        System.out.println(list);
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicArray<String> list = new DynamicArray<>();
        list.add("В");
        list.add("лесу");
        list.add("родилась");
        list.add("елочка");        
        System.out.println(list);
    }
}


>>> [В, лесу, родилась, елочка]

Множество

Множество

el1

el2

el3

el3

Множество

el1

el2

el3

el3

Множество

el1

el2

el3

el4

Множество

el1

el2

el3

el4

Хранит только уникальные элементы

public class Main {
    public static void main(String[] args) {
        DynamicArray<Integer> a = new DynamicArray<>();
        a.add(1);
        a.add(2);
        a.add(1);
        System.out.println(a.getSize());
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicArray<Integer> a = new DynamicArray<>();
        a.add(1);
        a.add(2);
        a.add(1);
        System.out.println(a.getSize());
    }
}

>>> 3
public class Main {
    public static void main(String[] args) {
        DynamicSet<Integer> a = new DynamicSet<>();
        a.add(1);
        a.add(2);
        a.add(1);
        System.out.println(a.getSize());
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicSet<Integer> a = new DynamicSet<>();
        a.add(1);
        a.add(2);
        a.add(1);
        System.out.println(a.getSize());
    }
}

>> 2
public class DynamicSet {
}
public class DynamicSet extends DynamicArray {
}
public class DynamicSet<T> extends DynamicArray<T> {
}
public class DynamicSet<T> extends DynamicArray<T> {
    public int indexOf(/* ??? */) {
        // Работать должен по принципу:
        // если элемент есть то возвращаем его индекс
        // если элемента нет то возвращаем -1
    }
}
public class DynamicSet<T> extends DynamicArray<T> {
    public int indexOf(T value) {
        // Работать должен по принципу:
        // если элемент есть то возвращаем его индекс
        // если элемента нет то возвращаем -1
    }
}
public class DynamicSet<T> extends DynamicArray<T> {
    public int indexOf(T value) {
        for (int i = 0;i < ???; ++i) {
        	
        }
    }
}
public class DynamicSet<T> extends DynamicArray<T> {
    public int indexOf(T value) {
        for (int i = 0;i < [size или data.length() ???]; ++i) {
        	
        }
    }
}
public class DynamicSet<T> extends DynamicArray<T> {
    public int indexOf(T value) {
        for (int i = 0;i < size; ++i) {
        	
        }
    }
}
public class DynamicSet<T> extends DynamicArray<T> {
    public int indexOf(T value) {
        for (int i = 0;i < size; ++i) {
            if (data[i] == value) {
            	//...
            }
        }
    }
}
public class DynamicSet<T> extends DynamicArray<T> {
    public int indexOf(T value) {
        for (int i = 0;i < size; ++i) {
            if (data[i] == value) {
            	return i;
            }
        }
    }
}
public class DynamicSet<T> extends DynamicArray<T> {
    public int indexOf(T value) {
        for (int i = 0;i < size; ++i) {
            if (data[i] == value) {
            	return i;
            }
        }
        return -1;
    }
}
public class DynamicSet<T> extends DynamicArray<T> {
    public int indexOf(T value) {
        for (int i = 0;i < size; ++i) {
            if (data[i].equals(value)) {
            	return i;
            }
        }
        return -1;
    }
}
public class DynamicSet<T> extends DynamicArray<T> {
    public int indexOf(T value) {
        for (int i = 0;i < size; ++i) {
            if (data[i].equals(value)) {
            	return i;
            }
        }
        return -1;
    }
}
public class DynamicSet<T> extends DynamicArray<T> {
    public int indexOf(T value) {
        for (int i = 0;i < size; ++i) {
            if (data[i].equals(value)) {
            	return i;
            }
        }
        return -1;
    }
}

Жмем Ctrl + O

public class DynamicSet<T> extends DynamicArray<T> {
    public int indexOf(T value) {
        for (int i = 0;i < size; ++i) {
            if (data[i].equals(value)) {
            	return i;
            }
        }
        return -1;
    }
    
    @Override
    public void add(T element) {
        super.add(element);
    }
}

Жмем Ctrl + O

public class DynamicSet<T> extends DynamicArray<T> {
    public int indexOf(T value) {
        for (int i = 0;i < size; ++i) {
            if (data[i].equals(value)) {
            	return i;
            }
        }
        return -1;
    }
    
    @Override
    public void add(T element) {
    	if (???) {
            super.add(element);
        }
    }
}
public class DynamicSet<T> extends DynamicArray<T> {
    public int indexOf(T value) {
        for (int i = 0;i < size; ++i) {
            if (data[i].equals(value)) {
            	return i;
            }
        }
        return -1;
    }
    
    @Override
    public void add(T element) {
    	if (indexOf(element) == -1) {
    	    super.add(element);
        }
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicSet<String> a = new DynamicSet<>();
        a.add("Ура!");
        a.add("Ура!");
        a.add("Ура!");
        System.out.println(a.getSize());
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicSet<String> a = new DynamicSet<>();
        a.add("Ура!");
        a.add("Ура!");
        a.add("Ура!");
        System.out.println(a.getSize());
    }
}

>>> 1
public class Main {
    public static void main(String[] args) {
        HashSet<String> a = new HashSet<>();
        a.add("Ура!");
        a.add("Ура!");
        a.add("Ура!");
        System.out.println(a.size());
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicSet<String> a = new DynamicSet<>();
        a.add("Ура!");
        a.add("Ура!");
        a.add("Ура!");
        System.out.println(a.getSize());
    }
}

>>> 1
public class Main {
    public static void main(String[] args) {
        HashSet<String> a = new HashSet<>();
        a.add("Ура!");
        a.add("Ура!");
        a.add("Ура!");
        System.out.println(a.size());
    }
}

>>> 1

Задача:
Подсчитать сколько уникальных символов в предложении

public class Main {
    public static void main(String[] args) {
        String text = "мама мыла раму";
    }
}

Задача:
Подсчитать сколько уникальных символов в предложении

public class Main {
    public static void main(String[] args) {
        String text = "мама мыла раму";
        
        DynamicSet<???> a = new DynamicSet<>();
    }
}

Задача:
Подсчитать сколько уникальных символов в предложении

public class Main {
    public static void main(String[] args) {
        String text = "мама мыла раму";
        
        DynamicSet<Character> a = new DynamicSet<>();
    }
}

Задача:
Подсчитать сколько уникальных символов в предложении

public class Main {
    public static void main(String[] args) {
        String text = "мама мыла раму";
        
        DynamicSet<Character> a = new DynamicSet<>();
        
        for(Character c : text.toCharArray()) {
            // ???
        }
    }
}

Задача:
Подсчитать сколько уникальных символов в предложении

public class Main {
    public static void main(String[] args) {
        String text = "мама мыла раму";
        
        DynamicSet<Character> a = new DynamicSet<>();
        
        for(Character c : text.toCharArray()) {
            a.add(c);
        }
    }
}

Задача:
Подсчитать сколько уникальных символов в предложении

public class Main {
    public static void main(String[] args) {
        String text = "мама мыла раму";
        
        DynamicSet<Character> a = new DynamicSet<>();
        
        for(Character c : text.toCharArray()) {
            a.add(c);
        }
        
        System.out.println(a.getSize());
    }
}

Словарик

ключи все разные

значения могут повторяться

ключ 1

ключ 2

ключ 3

...

значение 1

значение 2

значение 3

...

Гистограмма

ключи по X

значения по y

сентябрь

ноябрь

октябрь

декабрь

60

50

40

55

public class DynamicDict {
	
}

июнь

июль

август

10

20

5

ключи

значения

public class DynamicDict {
    DynamicSet<???> keys = new DynamicSet<>();
}

июнь

июль

август

10

20

5

ключи

значения

public class DynamicDict {
    DynamicSet<String> keys = new DynamicSet<>();
}

июнь

июль

август

10

20

5

ключи

значения

public class DynamicDict {
    DynamicSet<String> keys = new DynamicSet<>();
    DynamicSet<Integer> values = new DynamicSet<>();
}

июнь

июль

август

10

20

5

ключи

значения

public class DynamicDict {
    DynamicSet<String> keys = new DynamicSet<>();
    DynamicSet<Integer> values = new DynamicSet<>();
}

июнь

июль

август

10

20

10

ключи

значения

public class DynamicDict {
    DynamicSet<String> keys = new DynamicSet<>();
    DynamicArray<Integer> values = new DynamicArray<>();
}

июнь

июль

август

10

20

10

ключи

значения

public class DynamicDict <K, V> {
    DynamicSet<String> keys = new DynamicSet<>();
    DynamicArray<Integer> values = new DynamicArray<>();
}

июнь

июль

август

10

20

10

ключи

значения

public class DynamicDict <K, V> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
}

июнь

июль

август

10

20

10

ключи

значения

public class DynamicDict <K, V> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
    
    // метод который присваивает значение ключу
    public void put(???) {
        
    }
}

июнь

июль

август

10

20

10

ключи

значения

public class DynamicDict <K, V> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
    
    // метод который присваивает значение ключу
    public void put(??? key, ??? value) {
        
    }
}

июнь

июль

август

10

20

10

ключи

значения

public class DynamicDict <K, V> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
    
    // метод который присваивает значение ключу
    public void put(K key, V value) {
        
    }
}

июнь

июль

август

10

20

10

ключи

значения

public class DynamicDict <K, V> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
    
    // метод который присваивает значение ключу
    public void put(K key, V value) {
        int iKey = keys.indexOf(key);
    }
}

июнь

июль

август

10

20

10

ключи

значения

public class DynamicDict <K, V> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
    
    // метод который присваивает значение ключу
    public void put(K key, V value) {
        int iKey = keys.indexOf(key);
        if (iKey == -1) {
            // ???    
        }
    }
}

июнь

июль

август

10

20

10

ключи

значения

public class DynamicDict <K, V> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
    
    // метод который присваивает значение ключу
    public void put(K key, V value) {
        int iKey = keys.indexOf(key);
        if (iKey == -1) {
            keys.add(key);
            values.add(value);
        }
    }
}

июнь

июль

август

10

20

10

ключи

значения

public class DynamicDict <K, V> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
    
    // метод который присваивает значение ключу
    public void put(K key, V value) {
        int iKey = keys.indexOf(key);
        if (iKey == -1) {
            keys.add(key);
            values.add(value);
        } else {
            values.data[iKey] = value;
        }
    }
}

июнь

июль

август

10

20

10

ключи

значения

public class DynamicDict <K, V> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
    
    // метод который присваивает значение ключу
    public void put(K key, V value) {
        int iKey = keys.indexOf(key);
        if (iKey == -1) {
            keys.add(key);
            values.add(value);
        } else {
            values.data[iKey] = value;
        }
    }
    
    // метод который возвращает значение по ключу
    public ??? get(???) {

    }    
}

июнь

июль

август

10

20

10

ключи

значения

public class DynamicDict <K, V> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
    
    // метод который присваивает значение ключу
    public void put(K key, V value) {
        int iKey = keys.indexOf(key);
        if (iKey == -1) {
            keys.add(key);
            values.add(value);
        } else {
            values.data[iKey] = value;
        }
    }
    
    // метод который возвращает значение по ключу
    public V get(K key) {

    }    
}

июнь

июль

август

10

20

10

ключи

значения

public class DynamicDict <K, V> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
    
    // метод который присваивает значение ключу
    public void put(K key, V value) {
        int iKey = keys.indexOf(key);
        if (iKey == -1) {
            keys.add(key);
            values.add(value);
        } else {
            values.data[iKey] = value;
        }
    }
    
    // метод который возвращает значение по ключу
    public V get(K key) {
        int iKey = keys.indexOf(key);
    }    
}

июнь

июль

август

10

20

10

ключи

значения

public class DynamicDict <K, V> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
    
    // метод который присваивает значение ключу
    public void put(K key, V value) {
        int iKey = keys.indexOf(key);
        if (iKey == -1) {
            keys.add(key);
            values.add(value);
        } else {
            values.data[iKey] = value;
        }
    }
    
    // метод который возвращает значение по ключу
    public V get(K key) {
        int iKey = keys.indexOf(key);
        if (iKey != -1) {
            // ???
        }        
    }    
}

июнь

июль

август

10

20

10

ключи

значения

public class DynamicDict <K, V> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
    
    // метод который присваивает значение ключу
    public void put(K key, V value) {
        int iKey = keys.indexOf(key);
        if (iKey == -1) {
            keys.add(key);
            values.add(value);
        } else {
            values.data[iKey] = value;
        }
    }
    
    // метод который возвращает значение по ключу
    public V get(K key) {
        int iKey = keys.indexOf(key);
        if (iKey != -1) {
            return values.at(iKey);
        }        
    }    
}

июнь

июль

август

10

20

10

ключи

значения

public class DynamicDict <K, V> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
    
    // метод который присваивает значение ключу
    public void put(K key, V value) {
        int iKey = keys.indexOf(key);
        if (iKey == -1) {
            keys.add(key);
            values.add(value);
        } else {
            values.data[iKey] = value;
        }
    }
    
    // метод который возвращает значение по ключу
    public V get(K key) {
        int iKey = keys.indexOf(key);
        if (iKey != -1) {
            return values.at(iKey);
        }
        return null;
    }    
}

июнь

июль

август

10

20

10

ключи

значения

String text = "мама мыла раму";

Задача:
Подсчитать сколько какая буква встречается в предложении

String text = "мама мыла раму";

DynamicDict<Character, Integer> dict = new DynamicDict<>();

Задача:
Подсчитать сколько какая буква встречается в предложении

String text = "мама мыла раму";

DynamicDict<Character, Integer> dict = new DynamicDict<>();

for(Character c : text.toCharArray()) {

}

Задача:
Подсчитать сколько какая буква встречается в предложении

String text = "мама мыла раму";

DynamicDict<Character, Integer> dict = new DynamicDict<>();

for(Character c : text.toCharArray()) {
    if(dict.get(c) == null) {
    	// ???        
    }
}

Задача:
Подсчитать сколько какая буква встречается в предложении

String text = "мама мыла раму";

DynamicDict<Character, Integer> dict = new DynamicDict<>();

for(Character c : text.toCharArray()) {
    if(dict.get(c) == null) {
    	// если элемент не найден, то положил по ключу "c" значение 1
    }
}

Задача:
Подсчитать сколько какая буква встречается в предложении

String text = "мама мыла раму";

DynamicDict<Character, Integer> dict = new DynamicDict<>();

for(Character c : text.toCharArray()) {
    if(dict.get(c) == null) {
    	// если элемент не найден, то положил по ключу "c" значение 1
        dict.put(c, 1);
    }
}

Задача:
Подсчитать сколько какая буква встречается в предложении

String text = "мама мыла раму";

DynamicDict<Character, Integer> dict = new DynamicDict<>();

for(Character c : text.toCharArray()) {
    if(dict.get(c) == null) {
    	// если элемент не найден, то положил по ключу "c" значение 1
        dict.put(c, 1);
    } else {
    	// надо увеличить значение ключа на единицу
    }
}

Задача:
Подсчитать сколько какая буква встречается в предложении

String text = "мама мыла раму";

DynamicDict<Character, Integer> dict = new DynamicDict<>();

for(Character c : text.toCharArray()) {
    if(dict.get(c) == null) {
    	// если элемент не найден, то положил по ключу "c" значение 1
        dict.put(c, 1);
    } else {
    	// надо увеличить значение ключа на единицу
        int value = dict.get(c);
    }
}

Задача:
Подсчитать сколько какая буква встречается в предложении

String text = "мама мыла раму";

DynamicDict<Character, Integer> dict = new DynamicDict<>();

for(Character c : text.toCharArray()) {
    if(dict.get(c) == null) {
    	// если элемент не найден, то положил по ключу "c" значение 1
        dict.put(c, 1);
    } else {
    	// надо увеличить значение ключа на единицу
        int value = dict.get(c);
        dict.put(c, value + 1);
    }
}

Задача:
Подсчитать сколько какая буква встречается в предложении

String text = "мама мыла раму";

DynamicDict<Character, Integer> dict = new DynamicDict<>();

for(Character c : text.toCharArray()) {
    if(dict.get(c) == null) {
    	// если элемент не найден, то положил по ключу "c" значение 1
        dict.put(c, 1);
    } else {
    	// надо увеличить значение ключа на единицу
        int value = dict.get(c);
        dict.put(c, value + 1);
    }
}

System.out.println(dict);

Задача:
Подсчитать сколько какая буква встречается в предложении

String text = "мама мыла раму";

DynamicDict<Character, Integer> dict = new DynamicDict<>();

for(Character c : text.toCharArray()) {
    if(dict.get(c) == null) {
    	// если элемент не найден, то положил по ключу "c" значение 1
        dict.set(c, 1);
    } else {
    	// надо увеличить значение ключа на единицу
        int value = dict.get(c);
        dict.set(c, value + 1);
    }
}

System.out.println(dict);

Задача:
Подсчитать сколько какая буква встречается в предложении

м: 4
а: 4
 : 2
ы: 1
л: 1
р: 1
у: 1
String text = "мама мыла раму";

DynamicDict<Character, Integer> dict = new DynamicDict<>();

for(Character c : text.toCharArray()) {
    if(dict.get(c) == null) {
    	// если элемент не найден, то положил по ключу "c" значение 1
        dict.put(c, 1);
    } else {
    	// надо увеличить значение ключа на единицу
        int value = dict.get(c);
        dict.put(c, value + 1);
    }
}

System.out.println(dict);
String text = "мама мыла раму";

HashMap<Character, Integer> dict = new HashMap<>();

for(Character c : text.toCharArray()) {
    if(dict.get(c) == null) {
        // если элемент не найден, то положил по ключу "c" значение 1
        dict.put(c, 1);
    } else {
        // надо увеличить значение ключа на единицу
        int value = dict.get(c);
        dict.put(c, value + 1);
    }
}

System.out.println(dict);

Задача:
Подсчитать сколько какая буква встречается в предложении

м: 4
а: 4
 : 2
ы: 1
л: 1
р: 1
у: 1
String text = "мама мыла раму";

DynamicDict<Character, Integer> dict = new DynamicDict<>();

for(Character c : text.toCharArray()) {
    if(dict.get(c) == null) {
    	// если элемент не найден, то положил по ключу "c" значение 1
        dict.set(c, 1);
    } else {
    	// надо увеличить значение ключа на единицу
        int value = dict.get(c);
        dict.set(c, value + 1);
    }
}

System.out.println(dict);
String text = "мама мыла раму";

HashMap<Character, Integer> dict = new HashMap<>();

for(Character c : text.toCharArray()) {
    if(dict.get(c) == null) {
        // если элемент не найден, то положил по ключу "c" значение 1
        dict.put(c, 1);
    } else {
        // надо увеличить значение ключа на единицу
        int value = dict.get(c);
        dict.put(c, value + 1);
    }
}

System.out.println(dict);

Специализация дженериков

public class DynamicArray <T> {
    public Object[] data = new Object[3];
    int size = 0;

    public int getSize() { /*...*/ }

    public void add(T element) { /* ... */ }

    public T at(int index) { /* ... */ }

    @Override
    public String toString() { /* ... */ }
    
    public ??? Max() {
        
    }    
}
public class DynamicArray <T> {
    public Object[] data = new Object[3];
    int size = 0;

    public int getSize() { /*...*/ }

    public void add(T element) { /* ... */ }

    public T at(int index) { /* ... */ }

    @Override
    public String toString() { /* ... */ }
    
    public T Max() {
        
    }    
}
public class DynamicArray <T> {
    public Object[] data = new Object[3];
    int size = 0;

    public int getSize() { /*...*/ }

    public void add(T element) { /* ... */ }

    public T at(int index) { /* ... */ }

    @Override
    public String toString() { /* ... */ }
    
    public T Max() {
        T max = (T) data[0];        
    }    
}
public class DynamicArray <T> {
    public Object[] data = new Object[3];
    int size = 0;

    public int getSize() { /*...*/ }

    public void add(T element) { /* ... */ }

    public T at(int index) { /* ... */ }

    @Override
    public String toString() { /* ... */ }
    
    public T Max() {
        T max = (T) data[0]; 
        for(T el : (T[]) data) {
            // ???   
        }
    }    
}
public class DynamicArray <T> {
    public Object[] data = new Object[3];
    int size = 0;

    public int getSize() { /*...*/ }

    public void add(T element) { /* ... */ }

    public T at(int index) { /* ... */ }

    @Override
    public String toString() { /* ... */ }
    
    public T Max() {
        T max = (T) data[0]; 
        for(T el : (T[]) data) {
            if (el > max) {
                max = el;
            }
        }
    }    
}
public class DynamicArray <T> {
    public Object[] data = new Object[3];
    int size = 0;

    public int getSize() { /*...*/ }

    public void add(T element) { /* ... */ }

    public T at(int index) { /* ... */ }

    @Override
    public String toString() { /* ... */ }
    
    public T Max() {
        T max = (T) data[0]; 
        for(T el : (T[]) data) {
            if (el > max) {
                max = el;
            }
        }
        return max;
    }    
}
public class DynamicArray <T> {
    public Object[] data = new Object[3];
    int size = 0;

    public int getSize() { /*...*/ }

    public void add(T element) { /* ... */ }

    public T at(int index) { /* ... */ }

    @Override
    public String toString() { /* ... */ }
    
    public T Max() {
        T max = (T) data[0]; 
        for(T el : (T[]) data) {
            if (el > max) {
                max = el;
            }
        }
        return max;
    }    
}
public class DynamicArray <T extends Comparable> {
    public Object[] data = new Object[3];
    int size = 0;

    public int getSize() { /*...*/ }

    public void add(T element) { /* ... */ }

    public T at(int index) { /* ... */ }

    @Override
    public String toString() { /* ... */ }
    
    public T Max() {
        T max = (T) data[0]; 
        for(T el : (T[]) data) {
            if (el > max) {
                max = el;
            }
        }
        return max;
    }    
}
public interface Comparable<T> {
     public int compareTo(T other);
}

-1 если this меньше оther

0 если this равен other

1 если this больше other

public class DynamicArray <T extends Comparable> {
    public Object[] data = new Object[3];
    int size = 0;

    public int getSize() { /*...*/ }

    public void add(T element) { /* ... */ }

    public T at(int index) { /* ... */ }

    @Override
    public String toString() { /* ... */ }
    
    public T Max() {
        T max = (T) data[0]; 
        for(T el : (T[]) data) {
            if (el > max) {
                max = el;
            }
        }
        return max;
    }    
}
public interface Comparable<T> {
     public int compareTo(T other);
}

-1 если this меньше оther

0 если this равен other

1 если this больше other

public class DynamicArray <T extends Comparable> {
    public Object[] data = new Object[3];
    int size = 0;

    public int getSize() { /*...*/ }

    public void add(T element) { /* ... */ }

    public T at(int index) { /* ... */ }

    @Override
    public String toString() { /* ... */ }
    
    public T Max() {
        T max = (T) data[0]; 
        for(T el : (T[]) data) {
            if (el.compareTo(max) ???) {
                max = el;
            }
        }
        return max;
    }    
}
public class DynamicArray <T extends Comparable> {
    public Object[] data = new Object[3];
    int size = 0;

    public int getSize() { /*...*/ }

    public void add(T element) { /* ... */ }

    public T at(int index) { /* ... */ }

    @Override
    public String toString() { /* ... */ }
    
    public T Max() {
        T max = (T) data[0]; 
        for(T el : (T[]) data) {
            if (el.compareTo(max) == 1) {
                max = el;
            }
        }
        return max;
    }    
}
public class Main {
    public static void main(String[] args) {
        DynamicArray<Integer> array = new DynamicArray<>();
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicArray<Integer> array = new DynamicArray<>();
        array.add(3);
        array.add(2);
        array.add(5);
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicArray<Integer> array = new DynamicArray<>();
        array.add(3);
        array.add(2);
        array.add(5);
        System.out.println(array.Max());        
    }
}
public class DynamicArray <T extends Comparable> {
    public Object[] data = new Object[3];
    int size = 0;

    public int getSize() { /*...*/ }

    public void add(T element) { /* ... */ }

    public T at(int index) { /* ... */ }

    @Override
    public String toString() { /* ... */ }
    
    public T Max() {
        T max = (T) data[0]; 
        for(T el : (T[]) data) {
            if (el.compareTo(max) == 1) {
                max = el;
            }
        }
        return max;
    }    
}
public class DynamicArray <T extends Comparable> {
    public Object[] data = new Object[3];
    int size = 0;

    public int getSize() { /*...*/ }

    public void add(T element) { /* ... */ }

    public T at(int index) { /* ... */ }

    @Override
    public String toString() { /* ... */ }
    
    public T Max() {
        T max = (T) data[0]; 
        for(Object obj : data) {
            if (el.compareTo(max) == 1) {
                max = el;
            }
        }
        return max;
    }    
}
public class DynamicArray <T extends Comparable> {
    public Object[] data = new Object[3];
    int size = 0;

    public int getSize() { /*...*/ }

    public void add(T element) { /* ... */ }

    public T at(int index) { /* ... */ }

    @Override
    public String toString() { /* ... */ }
    
    public T Max() {
        T max = (T) data[0]; 
        for(Object obj : data) {
            T el = (T) obj;
            if (el.compareTo(max) == 1) {
                max = el;
            }
        }
        return max;
    }    
}
public class Main {
    public static void main(String[] args) {
        DynamicArray<Integer> array = new DynamicArray<>();
        array.add(3);
        array.add(2);
        array.add(5);
        System.out.println(array.Max());        
    }
}
public class Main {
    public static void main(String[] args) {
        DynamicArray<Integer> array = new DynamicArray<>();
        array.add(3);
        array.add(2);
        array.add(5);
        System.out.println(array.Max());        
    }
}


>>> 5
public class DynamicSet<T> extends DynamicArray<T> {
    public int indexOf(T value) {
        for (int i = 0;i < size; ++i) {
            if (data[i].equals(value)) {
            	return i;
            }
        }
        return -1;
    }
    
    @Override
    public void add(T element) {
    	if (indexOf(element) == -1) {
    	    super.add(element);
        }
    }
}
public class DynamicSet<T extends Comparable<T>> extends DynamicArray<T> {
    public int indexOf(T value) {
        for (int i = 0;i < size; ++i) {
            if (data[i].equals(value)) {
            	return i;
            }
        }
        return -1;
    }
    
    @Override
    public void add(T element) {
    	if (indexOf(element) == -1) {
    	    super.add(element);
        }
    }
}
public class DynamicDict <K, V> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
    
    // метод который присваивает значение ключу
    public void set(K key, V value) {
        int iKey = keys.indexOf(key);
        if (iKey == -1) {
            keys.add(key);
            values.add(value);
        } else {
            values.data[iKey] = value;
        }
    }
    
    // метод который возвращает значение по ключу
    public V get(K key) {
        int iKey = keys.indexOf(key);
        if (iKey != -1) {
            return values.at(iKey);
        }
        return null;
    }    
}
public class DynamicDict <K extends Comparable<K>, V> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
    
    // метод который присваивает значение ключу
    public void set(K key, V value) {
        int iKey = keys.indexOf(key);
        if (iKey == -1) {
            keys.add(key);
            values.add(value);
        } else {
            values.data[iKey] = value;
        }
    }
    
    // метод который возвращает значение по ключу
    public V get(K key) {
        int iKey = keys.indexOf(key);
        if (iKey != -1) {
            return values.at(iKey);
        }
        return null;
    }    
}
public class DynamicDict <K extends Comparable<K>, V extends Comparable<V>> {
    DynamicSet<K> keys = new DynamicSet<>();
    DynamicArray<V> values = new DynamicArray<>();
    
    // метод который присваивает значение ключу
    public void set(K key, V value) {
        int iKey = keys.indexOf(key);
        if (iKey == -1) {
            keys.add(key);
            values.add(value);
        } else {
            values.data[iKey] = value;
        }
    }
    
    // метод который возвращает значение по ключу
    public V get(K key) {
        int iKey = keys.indexOf(key);
        if (iKey != -1) {
            return values.at(iKey);
        }
        return null;
    }    
}

Мини контра

/* даны две функции */

public static int CalculateAdd(ArrayList<Integer> list) {
    int result = 0;
    for (int el : list) {
        if (el % 2 == 1) {
            result = result + el;
        }
    }
    return result;
}

public static int CalculateSub(ArrayList<Integer> list) {
    int result = 0;
    for (int el : list) {
        if (el % 2 == 0) {
            result = result - el;
        }
    }
    return result;
}

попытка вторая

Используя Function и BiFunction сделать из них одну универсальную. С помощью лямбда выражений вызвать новую функцию два раза так,

  • чтобы первый раз она сработала как CalculateAdd
  • а второй раз как CalculateSub
Made with Slides.com