Найти ответы in Java

Palych
Уже с Приветом
Posts: 13682
Joined: 16 Jan 2001 10:01

Re: Найти ответы in Java

Post by Palych »

brrdrr wrote: 19 Dec 2019 23:17 Вот тоже задачка на Java.
Имеется array и нужно найти минимальную разницу между его членами.
Вот что у меня получилось пока:

Code: Select all

package org.pal.stream;

import java.util.stream.Stream;

public class ConsumEx {
    public static void main(String[] a) {
        Stream<Integer> s1 = Stream.of(1, 5, 3, 11, 10);
        Res r = s1.sequential().sorted().collect(() -> new Res(), (res, i) -> {
            res.fmin(i);
        }, (res, res2) -> {
            //todo: combiner
        });
        System.out.println(r.diff);
    }

    static class Res {
        Integer prev;
        Integer diff;

        public void fmin(Integer i) {
            if (prev != null) {
                int newDiff = i - prev;
                if (diff == null || newDiff < diff) {
                    diff = newDiff;
                }
            }
            prev = i;
        }
    }
}
tessob
Уже с Приветом
Posts: 549
Joined: 07 Jan 2016 13:04

Re: Найти ответы in Java

Post by tessob »

KinDzaDza wrote: 21 Dec 2019 01:44Извините, что влезаю, но, так сказать чисто из любви к искусству - у вас горизонт завален ваш код ломается на массивах из одного элемента.
Возможно, в меня сейчас полетят тонны комментариев, но ломаться -- это нормальное поведение кода. Допустим мне надо выполнить цепочку функций над элементами стрима, то если любой оператор не будет выполнен по любой причине, это уже повод остановить обработку и вылететь наверх из стека с эксепшн. С ручными проверками даже если я и выиграю несколько наносекунд, я все равно буду вынужден бросить эксепшн. Просто, обычно любая обработка подобного рода исключений внутри логики обработки стрима приводит к разным вариантам хардкода или анальным трюкам с депенденси инжекшн.
fleshold
Уже с Приветом
Posts: 143
Joined: 29 Apr 2014 12:22

Re: Найти ответы in Java

Post by fleshold »

tessob wrote: 21 Dec 2019 12:18 ломаться -- это нормальное поведение кода.
фгранит :great:
Palych
Уже с Приветом
Posts: 13682
Joined: 16 Jan 2001 10:01

Re: Найти ответы in Java

Post by Palych »

Ломается в данном случае задача (не применима к единственному элементу)
Задача кода по возможности адекватно сообщить почему он сломался.
Palych
Уже с Приветом
Posts: 13682
Joined: 16 Jan 2001 10:01

Re: Найти ответы in Java

Post by Palych »

Кстати, тут я погорячился:
Palych wrote: 21 Dec 2019 03:58

Code: Select all

        }, (res, res2) -> {
            //todo: combiner
        });
Никакого туду с параллельным коллектором не получается.
Во всяком случае с сортировкой.
Может я чего-то не догоняю...
Palych
Уже с Приветом
Posts: 13682
Joined: 16 Jan 2001 10:01

Re: Найти ответы in Java

Post by Palych »

Вот что получилось. Не очень fancy, но работает с параллельными не сортированными потоками:

Code: Select all

package org.pal.stream;

import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;

public class ConsumEx {
    public static void main(String[] a) {
        MinDiffFinder collect = List.of(10, 40, 500, 444, 23, 525, 334, 356, 35, 93, 32, 44, 123, 53, 130, 21)
                .parallelStream()
                .collect(MinDiffFinder::new,
                        MinDiffFinder::accum, MinDiffFinder::combine);
        System.out.println(collect.minDiff);
    }

    static class MinDiffFinder {
        int minDiff = Integer.MAX_VALUE;
        SortedSet<Integer> set = new TreeSet<>();

        void accum(Integer i) {
            if (set.isEmpty()) {
                set.add(i);
            } else {
                if (minDiff != 0) {
                    if (set.contains(i)) {
                        minDiff = 0;
                    } else {
                        SortedSet<Integer> headSet = set.headSet(i);
                        if (! headSet.isEmpty()) {
                            int headDiff = i - headSet.last();
                            if (headDiff < minDiff) {
                                minDiff = headDiff;
                            }
                        }
                        SortedSet<Integer> tailSet = set.tailSet(i);
                        if (! tailSet.isEmpty()) {
                            int tailDiff = tailSet.first() - i;
                            if (tailDiff < minDiff) {
                                minDiff = tailDiff;
                            }
                        }
                        set.add(i);
                    }
                }
            }
        }
        void combine(MinDiffFinder other) {
            if (other.minDiff == 0) {
                minDiff = 0;
            } else {
                for (Integer i: other.set) {
                    accum(i);
                }
            }
        }
    }
}

User avatar
IvanGrozniy
Уже с Приветом
Posts: 10396
Joined: 04 Feb 2004 14:14
Location: Edgewater, NJ

Re: Найти ответы in Java

Post by IvanGrozniy »

first1 wrote: 20 Dec 2019 22:59 Это задача на алгоритмы. Решение без сортирoвки 0(n). С потоком тоже работает
Не думаю, что такое возможно с O(n) в данном случае.
first1
Posts: 2
Joined: 20 Dec 2019 22:54

Re: Найти ответы in Java

Post by first1 »

Максимальная разница между элементами массива - это разница между максимальным и минимальным элементами. Про сортировку в условии задачи ничего не сказано.
User avatar
IvanGrozniy
Уже с Приветом
Posts: 10396
Joined: 04 Feb 2004 14:14
Location: Edgewater, NJ

Re: Найти ответы in Java

Post by IvanGrozniy »

first1 wrote: 27 Dec 2019 04:39 Максимальная разница между элементами массива - это разница между максимальным и минимальным элементами. Про сортировку в условии задачи ничего не сказано.
Если расмматривать первоначальную задачу, то да, можно. Но со второй страницы народ обсуждает уже следующую задачу «найти минимальную разницу между элементами массива».
User avatar
liamkin
Уже с Приветом
Posts: 2603
Joined: 19 Jun 2003 20:22
Location: USA

Re: Найти ответы in Java

Post by liamkin »

IvanGrozniy wrote: 27 Dec 2019 13:06
first1 wrote: 27 Dec 2019 04:39 Максимальная разница между элементами массива - это разница между максимальным и минимальным элементами. Про сортировку в условии задачи ничего не сказано.
Если расмматривать первоначальную задачу, то да, можно. Но со второй страницы народ обсуждает уже следующую задачу «найти минимальную разницу между элементами массива».
найти минимальную разницу между максимальными элементами массива, с минимальными затратами, и максимально быстро!
User avatar
IvanGrozniy
Уже с Приветом
Posts: 10396
Joined: 04 Feb 2004 14:14
Location: Edgewater, NJ

Re: Найти ответы in Java

Post by IvanGrozniy »

liamkin wrote: 03 Jan 2020 17:38 найти минимальную разницу между максимальными элементами массива
:D Я один не понял этой связки?

Return to “Вопросы и новости IT”