JavaRush/Java блог/Архив info.javarush/Кухня(); Задание N7.
terranum
28 уровень

Кухня(); Задание N7.

Статья из группы Архив info.javarush
участников
Кухня(); Задание N7. - 1 Правила [Одномерные массивы] Дана последовательность действительных чисел a1, a2, ..., an. Заменить все ее члены, большие данного Z, этим числом. Подсчитать количество замен.
Комментарии (8)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
RabenokDmitry
Уровень 21
5 февраля 2015, 22:49
public static int changeValueMoreThenKey(int key, int... array) {
        int countChange = 0;
        if (array.length == 0)
            throw new IllegalArgumentException("Последовательность нулевой длинны");
        for (int value : array) {
            if (value < key) {
                value = key;
                countChange++;
            }
        }
        return countChange;
    }

Реализовал на int'ах, правда)
Docktor91
Уровень 40
23 августа 2014, 04:10
///
Voronblack
Уровень 17
22 августа 2014, 23:24
public static void replaceArrayValue(double z, double...arr)
    {

        int count = 0;
        if (arr.length == 0 )
            throw new IllegalArgumentException("Bad args");
        for(int i = 0; i < arr.length; i++)
        {
            if(arr[i] > z)
            {
                arr[i] = z;
                count++;
            }
        }

        for (Double ar : arr)
        {
            System.out.println(ar);
        }
        System.out.println(count);


    }
terranum
Уровень 28
22 августа 2014, 23:45
А почему в for each, ar приходит как объект Double а не примитив? Сам массив я бы выводил на экране в main-e, как я понял это для проверки, можно выводить через:
System.out.println(Arrays.toString(arr));

Варарг по уму, имя метода не придраться, все ровно и аккуратно, радует глаз. Так держать!
zharenkov
Уровень 30
22 августа 2014, 22:54
как насчет параллельного решения?) Собственно идея в чем:
1. Задаем количество нитей, которые будут менять массив.
2. Выделяем стандартный кусок массива, который будем обрабатывать и остаток, который мог бы остаться необработанным, т.к. размер массива может быть некратен числу нитей. Этот остаток отдадим нулевой нити.
3. Далее в цикле запускаем нити, который будут менять свои куски.
4. Ну и смотрим кол-во замен (статическая переменная count) и сам получившийся массив.

класс Solution
public class Solution {

    public static int count=0;
    public static int numberOfThreads=6;

    public static void main(String[] args) throws InterruptedException {
        double[] arr=new double[100];
        Arrays.fill(arr,6.0); // заполняем массив
        double z = 5;
        //выделяем каждой нити кусок и остаток, который отдадим нулевой нити
        int step = arr.length/numberOfThreads;
        int additionalElements = arr.length%numberOfThreads;

        //нулевой нити отдатся обычный кусок + остаток
        int firstIndex=0;
        int lastIndex=step+additionalElements;

        for (int i=0;i<numberOfThreads;i++){
            new ReplaceThread(arr,firstIndex,lastIndex,z).run();
            firstIndex=lastIndex; //далее каждой последующей нити будет отдаваться стандарный кусок массива
            lastIndex+=step;
        }
        Thread.sleep(500);
        System.out.println(count);
        System.out.println(Arrays.toString(arr));
    }
}


класс ReplaceThread
public class ReplaceThread extends Thread {
    private int firstIndex;
    private int lastIndex;
    private double z;
    private double[] arr;

    public ReplaceThread(double[] arr,int firstIndex,int lastIndex,double z){
        this.arr=arr;
        this.firstIndex=firstIndex;
        this.lastIndex=lastIndex;
        this.z=z;
    }
zharenkov
Уровень 30
22 августа 2014, 23:03
еще конечно можно было бы учесть случай, когда число нитей больше размера массива, но на практике думаю такой праздник жизни не встретить)
terranum
Уровень 28
23 августа 2014, 00:02
Круто! Слушай прикольно выходит, погоди так а что будет если массив дадут меньше 6?
Без пробелов тяжеловато читается, а так отличный пример для подражания. Тема интересная, надо развивать, лично мне параллельное программирование дается с трудом, парой даже не вспоминаю о нем. А надо бы! :)
zharenkov
Уровень 30
23 августа 2014, 01:13
если массив дадут меньше шести — первой нити достанется он целиком, а остальные будут запускаться и сразу завершаться, ибо для них кусочков не будет.