Главная страница
Навигация по странице:

  • Практическая 6.4. Тема

  • Коллекции 7.3.Тема: написание итератор по массивуЦель: написать итератор по массивуРешение

  • Практическая 7.4. Тема

  • Задача: Напишите итератор по двумерному массиву.Решение

  • Практическая 7.6. Тема

  • Многопоточность Практическая 8.0. Тема

  • Добавим WAITING и BLOCKED

  • Для TIMED_WAITING немного изменим тот же код

  • Практическая 8.1. Тема

  • Практическая 8.2. Тема

  • Практические Мацука. Основы программирования на. Net и Java


    Скачать 131.13 Kb.
    НазваниеОсновы программирования на. Net и Java
    Дата30.01.2023
    Размер131.13 Kb.
    Формат файлаdocx
    Имя файлаПрактические Мацука.docx
    ТипРешение
    #912697
    страница3 из 3
    1   2   3
    Тема: Stringbuilder с возможностью отслеживания состояния (паттерн наблюдатель)

    Цель: Stringbuilder с возможностью отслеживания состояния (паттерн наблюдатель)

    Задача:

    Напишите свой класс StringBuilder, с возможностью оповещения других объектов об изменении своего состояния. Для этого делегируйте все методы стандартному StringBuilder, а в собственном классе реализуйте шаблон проектирования «Наблюдатель».

    Решение:

    /**

    Слушатель.

    Каждый раз, когда меняется связанный с ним UndoableStringBuilder,

    вызывается метод onChange().

    */

    interface OnStringBuilderChangeListener {

    void onChange(OvservableStringBuilder stringBuilder);

    }

    class OvservableStringBuilder {

    // Слушатель, которого надо будет уведомить

    private OnStringBuilderChangeListener onChangeListener;

    // делегат

    private StringBuilder stringBuilder;

    // Сеттер для onChangeListener

    public void setOnChangeListener(OnStringBuilderChangeListener onChangeListener) {

    this.onChangeListener = onChangeListener;

    }

    public OvservableStringBuilder() {

    stringBuilder = new StringBuilder();

    }

    private void notifyOnStringBuilderChangeListener(){

    if(onChangeListener != null){

    onChangeListener.onChange(this);

    }

    }

    public OvservableStringBuilder append(Object obj) {

    stringBuilder.append(obj);

    notifyOnStringBuilderChangeListener();

    return this;

    }

    public OvservableStringBuilder replace(int start, int end, String str) {

    stringBuilder.replace(start, end, str);

    notifyOnStringBuilderChangeListener();

    return this;

    }

    public OvservableStringBuilder insert(int index, char[] str, int offset, int len) {

    stringBuilder.insert(index, str, offset, len);

    notifyOnStringBuilderChangeListener();

    return this;

    }

    // ....... Другие методы аналогично ..........

    public String toString() {

    return stringBuilder.toString();

    }

    }

    /**

    Конкретная реализация OnStringBuilderChangeListener

    */

    class MyListener implements OnStringBuilderChangeListener {

    /*

    Определяем метод onChange

    В него передаётся stringBuilder, который "прослушивается"

    */

    public void onChange(OvservableStringBuilder stringBuilder) {

    System.out.println("CHANGED: " + stringBuilder.toString());

    }

    }

    public class Main {

    public static void main(String[] strings) {

    OvservableStringBuilder UndoableStringBuilder =

    new OvservableStringBuilder();

    UndoableStringBuilder.setOnChangeListener(new MyListener());

    UndoableStringBuilder.append("Hello");

    UndoableStringBuilder.append(", ");

    UndoableStringBuilder.append("World!");

    }

    }

    Задача:

    Напишите метод filter, который принимает на вход массив (любого типа) и реализацию интерфейса Filter c методом apply(Object o), чтобы убрать из массива лишнее.

    Проверьте как он работает на строках или других объектах.

    Решение:

    interface Filter {

    boolean apply(Object o);

    }

    public class Main {

    public static Object[] filter(Object[] array, Filter filter) {

    int offset = 0;

    for(int i = 0; i< array.length; i++){

    if(!filter.apply(array[i])){

    offset++;

    } else{

    array[i - offset] = array[i];

    }

    }

    // Arrays.copyOf копирует значение из массива array в новый массив

    // с длинной array.length - offset

    return Arrays.copyOf(array, array.length - offset);

    }

    public static void main(String[] args) {

    String array[] =

    new String[]{"1rewf ", "feefewf", "a", null, "1"};

    String[] newArray = (String[]) filter(array, new Filter() {

    @Override

    public boolean apply(Object o) {

    return o != null;

    }

    });

    }

    }

    с Generics. Тогда можно использовать стандартный Function:

    public class Main {

    public static T[] filter(T[] array, Function filter) {

    int offset = 0;

    for (int i = 0; i < array.length; i++) {

    if (!filter.apply(array[i])) {

    offset++;

    } else {

    array[i - offset] = array[i];

    }

    }

    // Arrays.copyOf копирует значение из массива array в новый массив

    // с длинной array.length - offset

    return Arrays.copyOf(array, array.length - offset);

    }

    public static void main(String[] args) {

    String array[] =

    new String[]{"1rewf ", "feefewf", "a", null, "1"};

    String[] newArray = filter(array, s -> s != null);

    }

    }

    Практическая_6.4._Тема'>Практическая 6.4.

    Тема: заполнение массива

    Цель: заполнение массива

    Задача, немного похожая на предыдущую:

    Напишите метод fill, который принимает массив объектов, и реализацию интерфейса Function (или своего).

    Метод fill должен заполнить массив, получая новое значение по индексу с помощью реализации интерфейса Function. То есть, использовать его хочется так:

    public static void main(String[] args) {

    Integer[] squares = new Integer[100];

    fill(squares, integer -> integer * integer); // 0, 1, 4, 9, 16 .....

    }

    Решение:

    public static void fill(T[] objects, Function function) {

    for(int i = 0; i < objects.length; i++){

    objects[i] = function.apply(i);

    }

    }

    Коллекции

    7.3.

    Тема: написание итератор по массиву

    Цель: написать итератор по массиву

    Решение:

    class ArrayIterator implements Iterator{

    private T[] array;

    private int index = 0;

    public ArrayIterator(T[] array) {

    this.array = array;

    }

    @Override

    public boolean hasNext() {

    return index < array.length;

    }

    @Override

    public T next() {

    if(!hasNext())

    throw new NoSuchElementException();

    return array[index++];

    }

    }

    Практическая 7.4.

    Тема: Итератор по двумерному массиву

    Цель: Итератор по двумерному массиву

    Задача:

    Напишите итератор по двумерному массиву.

    Решение:

    class Array2d implements Iterable{

    private T[][] array;

    public Array2d(T[][] array) {

    this.array = array;

    }

    @Override

    public Iterator iterator() {

    return new Iterator() {

    private int i, j;

    @Override

    public boolean hasNext() {

    for(int i = this.i; i< array.length; i++){

    for(int j = this.j; j< array[i].length; j++){

    return true;

    }

    }

    return false;

    }

    @Override

    public T next() {

    if(!hasNext())

    throw new NoSuchElementException();

    T t = array[i][j];

    j++;

    for(int i = this.i; i< array.length; i++){

    for(int j = (i == this.i ? this.j : 0); j< array[i].length; j++){

    this.i = i;

    this.j = j;

    return t;

    }

    }

    return t;

    }

    };

    }

    }

    Практическая 7.6.

    Тема: Итератор по двум итераторам

    Цель: Итератор по двум итераторам

    Задача:

    Напишите итератор, который проходит по двум итератором.

    Решение:

    /**

    * @author Irina Poroshina

    */

    class ConcatIterator implements Iterator {

    private Iterator innerIterator1;

    private Iterator innerIterator2;

    public ConcatIterator (Iterator innerIterator1, Iterator innerIterator2) {

    this.innerIterator1 = innerIterator1;

    this.innerIterator2 = innerIterator2;

    }

    @Override

    public boolean hasNext() {

    while (innerIterator1.hasNext()) return true;

    while (innerIterator2.hasNext()) return true;

    return false;

    }

    @Override

    public T next() {

    if(!hasNext())

    throw new NoSuchElementException();

    while (innerIterator1.hasNext()) return innerIterator1.next();

    while (innerIterator2.hasNext()) return innerIterator2.next();

    return null;

    }

    }

    Многопоточность

    Практическая 8.0.

    Тема: Состояния

    Цель: состояния

    Задача:

    Выведите состояние потока перед его запуском, после запуска и во время выполнения.

    Решение:

    Thread thread = new Thread() {

    @Override

    public void run() {

    System.out.println(getState());

    }

    };

    System.out.println(thread.getState());

    thread.start();

    try {

    // Тут маленькая сложность есть только для вывода состояния TERMINATED:

    thread.join();

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    System.out.println(thread.getState());

    Добавим WAITING и BLOCKED:

    /**

    * Вывод состояния WAITING

    *

    * @param strings

    * @throws InterruptedException

    */

    public static void main(String[] strings) throws InterruptedException {

    Object lock = new Object();

    Thread thread = new Thread() {

    @Override

    public void run() {

    try {

    synchronized (lock) {

    lock.notifyAll();

    lock.wait();

    }

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    };

    synchronized (lock){

    thread.start(); // Запустим поток

    lock.wait(); // Будем ждать, пока поток не запустится

    System.out.println(thread.getState()); // WAITING

    lock.notifyAll();

    System.out.println(thread.getState()); // BLOCKED

    }

    }

    Для TIMED_WAITING немного изменим тот же код:

    /**

    * Вывод состояния WAITING

    *

    * @param strings

    * @throws InterruptedException

    */

    public static void main(String[] strings) throws InterruptedException {

    Object lock = new Object();

    Thread thread = new Thread() {

    @Override

    public void run() {

    try {

    synchronized (lock) {

    lock.notifyAll();

    lock.wait(3000);

    }

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    };

    synchronized (lock) {

    thread.start(); // Запустим поток

    lock.wait(); // Будем ждать, пока поток не запустится

    System.out.println(thread.getState()); // WAITING

    }

    }

    Практическая 8.1.

    Тема: Синхронизация потоков

    Цель: Синхронизация потоков

    Задача:

    Напишите программу, в которой создаются два потока, которые выводят на консоль своё имя по очереди.

    Решение:

    class StepThread extends Thread {

    // общий для двух потоков lock

    private Object lock;

    public StepThread(Object object) {

    this.lock = object;

    }

    /**

    * Идея такая: выводим имя потока, потом поток засыпает,

    * перед этим уведомив другой поток, о том, что теперь его очередь.

    *

    * После вызова первым потоком lock.notify() второй поток

    * не просыпается сразу, а ждёт,

    * пока lock не будет освобождён. А когда это происходит, уже вызван

    * метод lock.wait(), и первый поток ждёт своей очереди. И так по кругу.

    */

    @Override

    public void run() {

    while (true) {

    synchronized (lock) {

    try {

    System.out.println(getName());

    lock.notify();

    lock.wait();

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    }

    }

    }

    public class Main {

    public static void main(String[] strings) {

    Object lock = new Object();

    new StepThread(lock).start();

    new StepThread(lock).start();

    }

    }

    Практическая 8.2.

    Тема: Производитель-потребитель

    Цель: Производитель-потребитель

    Задача:

    Дано два потока — производитель и потребитель. Производитель генерирует некоторые данные (в примере — числа). Производитель «потребляет» их.

    Два потока разделяют общий буфер данных, размер которого ограничен. Если буфер пуст, потребитель должен ждать, пока там появятся данные. Если буфер заполнен полностью, производитель должен ждать, пока потребитель заберёт данные и место освободится.

    Производитель:

    // implements Runnable чтобы запускать в отдельном потоке

    class Producer implements Runnable {

    // Общая очередь

    private final Queue sharedQueue;

    // Максимальный размер

    private final int SIZE;

    // Конструктор

    public Producer(Queue sharedQueue, int size) {

    this.sharedQueue = sharedQueue;

    this.SIZE = size;

    }

    @Override

    public void run() {

    // Цикл бесконечен

    while (true) {

    try {

    // В цикле вызывается метод produce

    System.out.println("Produced: " + produce());

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    }

    private double produce() throws InterruptedException {

    synchronized (sharedQueue) { // обязательно synchronized

    if (sharedQueue.size() == SIZE) {

    // Если очередь полна, то ждём

    sharedQueue.wait();

    }

    // Добавили элемент в очередь.

    double newValue = Math.random();

    sharedQueue.add(newValue);

    // Уведомили другой поток на случай, если он ждет

    sharedQueue.notifyAll();

    return newValue;

    }

    }

    }

    Потребитель:

    // implements Runnable чтобы запускать в отдельном потоке

    class Consumer implements Runnable {

    // Общая очередь

    private final Queue sharedQueue;

    public Consumer(Queue sharedQueue) {

    this.sharedQueue = sharedQueue;

    }

    @Override

    public void run() {

    while (true) {

    try {

    System.out.println("Consumed: " + consume());

    } catch (InterruptedException ex) {

    ex.printStackTrace();

    }

    }

    }

    // Метод, извлекающий элементы из общей очереди

    private Double consume() throws InterruptedException {

    synchronized (sharedQueue) {

    if (sharedQueue.isEmpty()) { // Если пуста, надо ждать

    sharedQueue.wait();

    }

    sharedQueue.notifyAll();

    return sharedQueue.poll();

    }

    }

    }

    Создание и запуск:

    public static void main(String[] strings) {

    LinkedList sharedQueue = new LinkedList<>();

    int size = 4;

    Thread prodThread = new Thread(new Producer(sharedQueue, size), "Producer");

    Thread consThread = new Thread(new Consumer(sharedQueue), "Consumer");

    prodThread.start();

    consThread.start();

    }

    Список литературы :
    https://pcnews.ru/blogs/prakticeskie_zadaci_po_java__dla_kursov_i_procih_zanatij-897377.html


    1. Е.В. Андреева Методика обучения основам программирования на уроках информатики. Лекции 1-8. – М.: Педагогический университет «Первое сентября», 2006.

    2. В.А. Дагене, Г.К. Григас, А.Ф. Аугутис 100 задач по программированию. – М.: Просвещение, 1993. - 255 с.

    3. В.В. Фаронов Турбо Паскаль 7.0. Начальный курс. Учебное пособие. – М.: «Нолидж», 1999. - 616 с.

    4. Книга В. Монахов – Язык программирования Java

    https://studfile.net/preview/6791031/
    1   2   3


    написать администратору сайта