Професионална програма
Loading...
+ Нов въпрос
AnnaIvanova11 avatar AnnaIvanova11 20 Точки

JAVA ADVANCED,MISUNDERSTANDING STREAM API WITH OBJECTS

Здравейте,

Може ли някой, ако може да погледне, кода и да каже може ли да се направи със StreamApi и как ще изглежда.  // @MARTINBG 

Това е масив от обекти, в метода се търси броя по - големи елементи от подадения.

Благодаря предварително!

 public int getCountGreater(E element) {
        int counter = 0;
        for (int i = 0; i < this.size; i++) {
            if (this.getAt(i).compareTo(element) > 0) {
                counter++;
            }
        }
        return counter;
    }

 

1
Java Advanced
MartinBG avatar MartinBG 2826 Точки
Best Answer

Може да се използва комбинация от filter и count (трябва да кастнем резултатата от long към int).

Варианти без директен достъп до масива (използваме getAt метода за извличане на елементите):

        public int getCountGreater(E element) {
            return (int) IntStream.range(0, this.size)
                    .filter(index -> getAt(index).compareTo(element) > 0)
                    .count();
        }

Или така: 

        public int getCountGreater(E element) {
            return (int) IntStream.range(0, this.size)
                    .mapToObj(this::getAt)
                    .filter(current -> current.compareTo(element) > 0)
                    .count();
        }

Ако масива е достъпен, например от поле с име data:

        public int getCountGreater(E element) {
            return (int) Arrays.stream(this.data)
                    .filter(current -> current.compareTo(element) > 0)
                    .count();
        }

 

1
AnnaIvanova11 avatar AnnaIvanova11 20 Точки

Благодаря !!! 

1
AnnaIvanova11 avatar AnnaIvanova11 20 Точки

Още един глупав въпрос, извинявам се, че досаждам. Как да намерим макс и мин елементите? Трябва ли да кастна в stream -a към типа <Е>, опитах Stream<E> и каквото намерих в нета, но не го разбирам и не ми се получава. Ако взема от метода, където гетвам по индекс, той е кастнат към generic, но ми връща обект и пак не ми позволява да дам макс с Comperator, a с ламбда не достъпва друго освен classname. 

Иначе с обикновения for ... :

public E getMax() {
    E max = this.getAt(0);
    for (int i = 0; i < this.size; i++) {
        if (this.getAt(i).compareTo(max) > 0) {
            max = this.getAt(i);
        }
    }
    return max;
}

 

1
14/06/2020 20:41:27
MartinBG avatar MartinBG 2826 Точки

@AnnaIvanova11

За да използваме compareTo метода, Е трябва да екстендва Comparable<E>:

public class MyDataClass <E extends Comparable<E>> { 
    // fields, Constructor(s), other methods 

    public E getMax() {
        E max = this.getAt(0);
        for (int i = 0; i < this.size; i++) {
            if (this.getAt(i).compareTo(max) > 0) {
                max = this.getAt(i);
            }
        }
        return max;
    }
}

Ето варианти със стрийм за getMin/getMax:

public E getMax() {
    return Arrays.stream(data)
            .max(E::compareTo)
            .orElseThrow();
}

public E getMin() {
    return Arrays.stream(data)
            .min(E::compareTo)
            .orElseThrow();
}

 

 

Ето и цялото демо:

import java.util.Arrays;

public class Demo {
    public static void main(String[] args) {
        Integer[] data = {0, 1, 2, 3, 4, 100, -100};
        MyDataClass<Integer> myDataClass = new MyDataClass<>(data);

        System.out.println(myDataClass.getMax()); // 100
        System.out.println(myDataClass.getMin()); // -100

        System.out.println("Exception expected:");
        System.out.println(new MyDataClass<>(new Integer[0]).getMax()); // throws NoSuchElementException
    }

    private static class MyDataClass<E extends Comparable<E>> {
        private E[] data;
        private int size;

        public MyDataClass(E[] data) {
            this.data = data;
            this.size = data.length;
        }

        public E getAt(int index) {
            return data[index];
        }

        public E getMax() {
            return Arrays.stream(data)
                    .max(E::compareTo)
                    .orElseThrow();
        }

        public E getMin() {
            return Arrays.stream(data)
                    .min(E::compareTo)
                    .orElseThrow();
        }
    }
}

 

1
15/06/2020 05:45:05