# Array Werte vergleichen



## rubbG6 (26. Mai 2022)

Hallo zusammen,

ich muss prüfen, ob der nächste Wert eines Arrays das Zehnfache des vorangegangenen Wertes ist. 
Beispiel: int arr[] = {1,2,20}; hier ist i=2 das zehnfache des Wertes an der Stelle i=1.


```
int arr[] = {1,2,20};
    
    for(int i = 0; i < arr.length; i++) {
            
    boolean c;
            
        if(arr[i-1] == (arr[i] *10)){
            c = true;
        } else {
            c= false;
        }   
        System.out.print(c);
    }
```

Leider weiß ich nicht wie ich den darauffolgenden Indexwert eines Arrays abfragen kann. Mein Code gibt mir eine Fehlermeldung.

Über jede Hilfe wäre ich dankbar.


----------



## KonradN (26. Mai 2022)

Dann teile uns doch bitte mit, was für eine Fehlermeldung du bekommst. Das würde es deutlich vereinfachen.

Und Du solltest immer als erstes in Worte fassen, was genau du machen musst. Sprich: Spiel alles einfach mit Stift und Papier durch und beschreibe die Schritte so, dass jeder diesen folgen könnte ohne die Aufgabe zu kennen.

Ich sehe hier zwei Probleme:
a) Du musst die Grenzen prüfen - auf welche Indices kannst Du bei einem Array zugreifen? Und auf welche greift Dein Code zu?
b) Du willst ein Ergebnis für das ganze Array - da ist es falsch, nach jedem Schritt das Ergebnis zu setzen. Das "Pattern" hier ist immer gleich: Du machst eine Annahme und prüfst die dann für alle Elemente auf Richtigkeit um dann ggf. die Annahme umzusetzen.


----------



## rubbG6 (26. Mai 2022)

Edit: Vielleicht wäre eine zweite for-Schleife hilfreich, die die Werte des Arrays um eins versetzt abfragt…


----------



## rubbG6 (26. Mai 2022)

KonradN hat gesagt.:


> Dann teile uns doch bitte mit, was für eine Fehlermeldung du bekommst. Das würde es deutlich vereinfachen.
> 
> Und Du solltest immer als erstes in Worte fassen, was genau du machen musst. Sprich: Spiel alles einfach mit Stift und Papier durch und beschreibe die Schritte so, dass jeder diesen folgen könnte ohne die Aufgabe zu kennen.
> 
> ...


Die Fehlermeldung lautet: Index -1 out of bounds for length 3. Ich verstehe ja auch, was das bedeutet: Ich kann keine Werte des Arrays außerhalb des "Containers" abfragen, da hier keine Werte existieren. Wie kann ich zwei aufeinanderfolgende Werte eines Arrays vergleichen?


----------



## KonradN (26. Mai 2022)

Du machst es doch prinzipiell in dem Code bereits. Nur eben versuchst Du auf ein Element vor dem ersten Element zuzugreifen. Und Deine Bedingung macht auch nicht das, was beschrieben ist. Daher halt mein Ratschlag, das doch erst einmal im Detail wirklich durchzuspielen und zu schauen, was Du genau machen musst, um genau sowas zu prüfen. Damit würdest Du alle Probleme lösen können, weil Du halt im Detail alles schon durchgespielt hättest.


----------



## rubbG6 (26. Mai 2022)

Ich nehme Index 0 und vergleiche ihn mit Index 1 -> false, da 2 nicht das Zehnfache von 1 ist.
Ich nehme Index 1 und vergleiche ihn mit Index 2
-> true, da 20 das Zehnfache von 2 ist.


----------



## rubbG6 (26. Mai 2022)

Ich habe die Lösung (wenn auch unübersichtlich, da in der Konsole alle false ebenfalls ausgegeben werden) gefunden.

```
public static void isArray110(int[] arr) {
       
   
        for(int i = 0; i < arr.length; i++) {
           
            for(int j = 1; j < arr.length; j++) {
           
            boolean c = false;
           
            if(arr[i] == (arr[j] * 10)){
                c = true;
            }
            System.out.print(c);
            }
        }
    }
```

Die Aufgabe lautete:
Der Funktion isArray110() wird ein int-Feld als Parameter übergeben. In
diesem Feld wird geprüft ob es für ein Element einen direkten Nachfolger mit
dem zehnfachen Wert gibt.


----------



## KonradN (26. Mai 2022)

Also das, was Du in #6 hast, ist nur ein Teil. Was Du in #7 hast ist komplett falsch - schlimmer als das, was Du im ersten Part hattest!


----------



## rubbG6 (26. Mai 2022)

rubbG6 hat gesagt.:


> Ich nehme Index 0 und vergleiche ihn mit Index 1 -> false, da 2 nicht das Zehnfache von 1 ist.
> Ich nehme Index 1 und vergleiche ihn mit Index 2 -> true, da 20 das Zehnfache von 2 ist.


Sobald meine Bedingung stimmt, also ein Element das Zehnfache vom vorherigen Element ist, setze ich meinen boolean auf true und gebe es in der Konsole aus. Ich weiß nicht, was ich noch weiter im Detail durchspielen soll.


----------



## KonradN (26. Mai 2022)

Also wenn die Aufgabe lautet, dass Du das nur prüfen sollst um dann da dann irgendwas auszugeben, dann wäre es so ok. Aber mein Verständnis der Aufgabe weicht davon ab. 

Davon abgesehen macht Dein Code etwas anderes. Dein Code macht extrem viele Prüfungen und gibt von jeder Prüfung das Ergebnis aus.

Dann ist dein Ablauf prinzipiell ok für ein Array mit 3 Elementen. Was ist mit 4 Elementen? Mit 5 Elementen? Kannst Du es universell für n Elemente formulieren?


----------



## KonradN (26. Mai 2022)

Also nur um es einfach einmal aufzuzeigen, was ich hier als Verständnis der Aufgabe von Dir erwarten würde:

Gegeben eine Liste von mehrere Zahlen.
Gibt es eine Zahl, welche zehn mal so hoch ist, wie ihr Vorgänger?

Haben wir eine gefunden := nein (bisher nicht)
Ab dem 2ten Element gehen wir alle Zahlen durch
--> Ist die Zahl 10 mal so gross wie der Vorgänger? Ja: Haben wir eine gefunden := ja
Ergebnis: Wert von "Haben wir eine gefunden"

Das ist eine Anleitung, die man jedem geben könnte. Und deren Elemente man nun in die Java Sprache umsetzen können. Und so ein fachliches Verständnis muss (!!) der Anfang sein! Du kannst nicht erwarten, dass Du einen korrekten Code schreibst ohne die Aufgabe und den Lösungsweg verstanden zu haben.


----------



## rubbG6 (26. Mai 2022)

Danke für die Hilfe. Ich werde mich mit der Aufgabe später nochmals befassen und mein Ergebnis hier posten.


----------



## HolyFUT (26. Mai 2022)

Müsstest du hier nicht Object.equals verwenden um zwei Integer zu vergleichen, da es sich hier um ein Objekt handelt?


----------



## KonradN (26. Mai 2022)

HolyFUT hat gesagt.:


> Müsstest du hier nicht Object.equals verwenden um zwei Integer zu vergleichen, da es sich hier um ein Objekt handelt?


Zwei Dinge wären hier anzumerken:

a) Hier wurde ein int Array verwendet und kein Integer Array. In dem Array sind also keine Integer Instanzen sondern wirklich nur int Werte.

b) Wären im Array Integer Instanzen, dann wäre wichtig, dass
b.1) auf einer Seite eine Operation (*) ist mit einem int Literal (10) -> Da wäre nach JLS 4.2.2 das Ergebnis ein int (oder long, wenn da ein long beteiligt wäre)
b.2) wenn auf einer Seite eines Vergleichs ein Wert-Typ ist und die andere Seite konvertierbar, dann findet ein Vergleich der Wertetypen statt (JLS 15.21.1).

Damit ist der Code soweit korrekt - selbst bei Verwendung von einem Integer Array.

Aber der Gedanke ist auf jeden Fall korrekt und es ist wichtig, darüber nachzudenken und ggf. nimmt man statt dessen lieber ein equals Aufruf (dann würde man merken, dass man kein equals auf einem in aufrufen kann oder man hätte z.B. mit Objects.equals gearbeitet und hätte da dann ein Boxing).


----------

