Fehler getMaxOf

Hallo ihr Lieben,
vielleicht hat einer von euch Lust mir bei meiner Fehlersuche zu helfen?
Bei dieser getMaxOF Methode werden einzelne Apartments ausgegeben. Es müssten aber auch Listen sein, da es mehrere Apartments mit zB der höchsten Miete geben kann …

Teil 1 (Hilfsmethode)

Java:
public int getMaxFromIntegerList(List<Integer> integerList, int getMin){
/*
* This method returns the index (int) of the highest int from integerList.
* Can also be used to return min. value element of given list.
* To do that min{givenIntegerList} is definded as max(givenIntegerList + (0 - max{givenIntegerList} )}}
* max. Element of given list [min -> max of (max - list elements)]
* Example array1[1,2,3]
* for max. value: integerList = [1,2,3], getMin = 0; => returns 3
* for min. value: integerList = [1,2,3], getMin = 0 - getMaxFromIntegerList([1,2,3], 0); => returns 1
*/
int indexOfMax = 0;
int currentIndex = 0;
int valueMax = 0;
int minOrMax = 1;
Iterator<Integer> it = integerList.iterator();

if(getMin == 0){
        minOrMax = -1;
}
while(it.hasNext()){
        if((getMin - minOrMax*(it.next())) > valueMax){
        valueMax = it.next();
        indexOfMax = currentIndex;
}
currentIndex++;
}
return(currentIndex
Teil 2 (Methode mit Fehler aber kA warum)

Java:
public Apartment getBiggestApartment(){
return(apartments.get(getMaxFromIntegerList(list -> {apartments.stream()
                                                                 .map(apartment -> apartment.getSquareMeter())
                                                                 .toArray(Integer[]::new);
                                                      }, 0)));
 
Du rufst in einer Iteration zwei mal Iterator#next auf. Diese Methode gibt dir bei jedem Aufruf das *nächste* Element in der Collection. Das bedeutet, dass du ein Element nutzt um in der if die Abfrage zu machen und ein anderes Element für die Zuweisung nutzt. Ruf pro Iteration nur einmal Iterator#next pro Iteration auf und speicher dir das Element in einer Variable zwischen.

Weiterhin versuchst du der Methode getMaxFromIntegerList als ersten Parameter ein Integer-Array zu übergeben, obwohl diese eine Liste von Integern erwartet. Anstatt den Stream in ein Array zu konvertieren, solltest du ihn über collect(Collectors.toList()); zu einer Liste konvertieren.
 
vielleicht hat einer von euch Lust mir bei meiner Fehlersuche zu helfen?
Das scheitert schon an der Doku zu Teil 1.

This method returns the index (int) of the highest int from integerList.
Soweit verständlich: man bekommt den Index des größten Werts der Liste

Can also be used to return min. value element of given list.
Jetzt fängt es an, unrealistisch zu werden: die Methode, die Dir den Index des größten Elements liefert, kann auch dazu benutzt werden, den Wert des kleinsten Elements zu erhalten?

To do that min{givenIntegerList} is definded as max(givenIntegerList + (0 - max{givenIntegerList} )}}
Das Minimum einer Liste ist definiert als das Maximum der Liste, auf die ein (ggf. negativer) Wert addiert wird?!? Wie ist das Addieren eines Werts zu einer Liste definiert?

max. Element of given list [min -> max of (max - list elements)]
?!?

Example array1[1,2,3]
for max. value: integerList = [1,2,3], getMin = 0; => returns 3
Warum denn 3, wo doch der Index des höchsten Werts 2 ist?

Abgesehen davon: was soll die Methode denn liefern, wenn Du für getMin einen x-beliebigen (ggf. positiven) Wert einsetzt?
 
Teil 1 (Hilfsmethode)
Du solltest die Hilfsmethode
Java:
public int getMaxFromIntegerList(List<Integer> integerList, int getMin){
/*
* This method returns the index (int) of the highest int from integerList.
* Can also be used to return min. value element of given list.
* To do that min{givenIntegerList} is definded as max(givenIntegerList + (0 - max{givenIntegerList} )}}
* max. Element of given list [min -> max of (max - list elements)]
* Example array1[1,2,3]
* for max. value: integerList = [1,2,3], getMin = 0; => returns 3
* for min. value: integerList = [1,2,3], getMin = 0 - getMaxFromIntegerList([1,2,3], 0); => returns 1
*/
mehrfach überdenken.
1) Der Name der Methoden passt nicht zu dem was sie macht.
Wobei die Doku auch mehrdeutig ist. In den Beispielen wird der maximale Wert in der Liste zurück gegeben. Weiter oben steht aber, dass der Index des höchsten Wertes geliefert wird. Aber zurück zum Namen selbst. getMax… bedeutet, dass ein Maximum ermittelt wird. Deine Methode ermöglicht es aber auch das Minimum zu berechnen. Also ein semantischer Widerspruch.
2) Du benutzt Integer als Typ.
Besser wäre hier aber Comparable, um mehr Flexibilität der Funktion zu gewährleisten.
So könnte man statt Integer z.B. auch Float für 2,5 m^2 verwenden.

Also mache für Minimum und Maximum 2 getrennte Funktionen. Da Du mit einer Liste arbeitest ist auch der Ansatz den Index zu ermitteln der bessere, da man mit dem Index Zugriff auf das Objekt hat.

Beispiel für das Maximum.
Java:
/**
     * @param values
     *            List<Comparable>
     * @return Index of the maximum value in the list.
     */
    public static <T extends Comparable<T>> int getIdOfMax(List<T> values) {
        if (values == null || values.size() == 0)
            return -1;
        int maxId = 0;
        for (int i = 0; i < values.size(); i++) {
            if (values.get(i).compareTo(values.get(maxId)) > 0)
                maxId = i;
        }
        return maxId;
    }
Die passend Minimum Funktion geht analog.

Solltest Du aber für Minimum und Maximum auf nur eine Funktion bestehen, kann man das mit einem Comparator lösen.
Beispiel:
Java:
public class start {
    public static void main(String[] args) {
        List<Integer> v = Arrays.asList(new Integer[] { 3, 7, -1, 8, 9, 0 });
        int id = getIdByComparator(v, new MAX_Integer());
        System.out.println(String.format("Maxium ist  :\t%d\tid[%d]", v.get(id), id));
        id = getIdByComparator(v, new MIN_Integer());
        System.out.println(String.format("Minimum ist :\t%s\tid[%d]", v.get(id), id));
    }

    /**
     * @param list
     *            List<Comparable>
     * @return Index of maximum value in the list (specified by a Comparator) or -1,
     *         if list is null or empty .
     */
    public static <T extends Comparable<T>> int getIdByComparator(List<T> list, Comparator<T> cmp) {
        if (list == null || list.size() == 0)
            return -1;
        int maxId = 0;
        for (int i = 0; i < list.size(); i++) {
            if (cmp.compare(list.get(i), list.get(maxId)) > 0)
                maxId = i;
        }
        return maxId;
    }
    public static class MIN_Integer implements Comparator<Integer> {
        @Override
        public int compare(Integer a, Integer b) {
            return b.compareTo(a);
        }
    }
    public static class MAX_Integer implements Comparator<Integer> {
        @Override
        public int compare(Integer a, Integer b) {
            return a.compareTo(b);
        }
    }
}
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben