# Abstand zwischen den Doppelwerten in einem Array herausfinden



## Dilara_K (7. Apr 2018)

Hallo liebe Leute,
Ich habe folgendes Problem.Gegeben ist ein Array und ich muss den Abstand zwischen gleichen Werten finden und der Wert, der niedrigste Abstand zu seinem Doppelgänger hat, muss ich zurückgeben.Meine frage ist, kennt ihr Methoden, die das Lösen leichter machen würde?
Mein Code der noch nicht fertig ist;

```
int firstDuplicate(int[]a) {
  int jetzt=0;
  int wert=0;
   for(int i=0; i<a.length-1; i++){
      for(int k=i+1; k<a.length-1; k++){
         if(a[i]!=a[k]){
            jetzt++;
         }
      }
  }
```


----------



## Javinner (7. Apr 2018)

@Dilara_K 
Wie würdest du es machen, wenn du kein Rechner zur Hand hättest?
Was wären die nötigen Schritte und Informationen?


----------



## Dilara_K (7. Apr 2018)

@Javinner 
1.Schritt: den ersten Term nehmen und mit jeder anderen Elemente im Array vergleichen. Solange sie nicht gleich sind soll ein variable hochzählen zum Beispiel "int counter".Wenn zum Beispiel in der Mitte irgendwo der Vorgang abgebrochen wird, dann sagt mir "counter " wie viel er hochgezählt hat also den Abstand.
2.Schritt: Diese Abstand soll einem anderen Variablen übergeben werden zum Beispiel "int abstand", und nun nimmt man den zweiten Element von Array und macht man das gleiche Vergleich.
3.Schritt: Jetzt nach der ganzen Vergleich von zweiten Element im Array , soll gefragt werden ob der neuer "counter" kleiner ist als unserem "abstand".Wenn ja überschreiben wir "abstand" mit neuem Wert,denn wir suchen ja den Element mit kleinstem Abstand zu seinem Doppelgänger
4. ab hier verliere ich den Faden. Ich soll ja den Element zurückgeben und nicht den Abstand selbst.


----------



## Javinner (7. Apr 2018)

Dilara_K hat gesagt.:
			
		

> Ich habe folgendes Problem.Gegeben ist ein Array und ich muss den Abstand zwischen gleichen Werten finden und der Wert, der niedrigste Abstand zu seinem Doppelgänger hat, muss ich zurückgeben


Kann man denn davon ausgehen, dass das besagte Array nur zwei gleiche Werte inne hat?, oder sieht das Array unter Umständen so aus, dass mehrere Doppelwerte vorkommen können? 
Am Besten, du postest das Array hier, dann sehen wir weiter. Benutze bitte die Code-Tags `[code=Java][/code]`


----------



## Javinner (7. Apr 2018)

Schön, dass du am Ball bleibst  Als Anreiz:

```
public class JavaApplication13
{

    public static void main(String[] args)
    {
        int[] value_Array_A = {1, 3, 4, 6, 8, 9, 2, 3};
        int[] value_Array_B = {4, 5, 7, 3, 2, 5, 9, 0};

        doubleNumberInArray(value_Array_A);
        doubleNumberInArray(value_Array_B);
    }

}
/** Konsolenausgabe */
Die Zahl: 3 ist doppelt
Der Abstand beträgt: 5 Felder
Die Zahl: 5 ist doppelt
Der Abstand beträgt: 3 Felder
```
Dann viel Erfolg!


----------



## Dilara_K (8. Apr 2018)

@Javinner 
Danke noch mal für den Anreiz
ja genau es sind mehrere Arrays in dem auch mehrere doppelte werte vorkommen wie zum bespiel
a = [2, 3, 3, 1, 5, 2] hier wäre die output 3 weil zwischen dreien ist der Abstand kleiner.
Ich will  aber nicht aufgeben
Nicht die Aufgabe mich sondern ich mach sie fertig hahahaha


----------



## Robat (8. Apr 2018)

Dilara_K hat gesagt.:


> 4. ab hier verliere ich den Faden. Ich soll ja den Element zurückgeben und nicht den Abstand selbst.


Vielleicht hierzu noch einen kleinen Tipp:
Zstl. kannst du dir noch eine Variable anlegen, die sich den Wert mit dem kleinsten Abstand merkt. Wenn du dann den counter überschreibst kannst du zstl auch noch den Wert überschreiben.
Somit hast du am Ende die Zahl, die du zurückgeben musst.


----------



## Xyz1 (8. Apr 2018)

Vielleicht etwas tricky:

```
import java.util.Random;

/**
 *
 */
public class Abstand {
    public static void main(String[] args) {
        new Abstand().a(new int[]{1, 2, 3, 4, 5, 1, 6, 1});
        System.out.println();
        new Abstand().a(new Random().ints(10, 1, 5).toArray());
    }

    void a(int[] a) {
        for (int i = 0; i < a.length; i++) {
            for (int j = find(a[i], i, a); j != -1; j = find(a[j], j, a)) {
                System.out.println(i + " " + j + " " + a[i] + " " + (j - i));
            }
        }
    }

    int find(int v, int i, int[] a) {
        while (++i < a.length) {
            if (v == a[i]) {
                return i;
            }
        }
        return -1;
    }
}
```

0 5 1 5
0 7 1 7
5 7 1 2

-> Zwischen 1 an Platz 0 und 1 an Platz 5 liegen 5,
zwischen 1 an Platz 0 und 1 an Platz 7 liegen 7,
zwischen 1 an Platz 5 und 1 an Platz 7 liegen 2 ...

Ok den Rest erspare ich euch.


----------



## Vogan1972 (9. Apr 2018)

@DerWissende alter lachs - ich als blutiger anfänger bei dem die Java(9) bücher meiner bibliothek noch keine woche alt sind und ich mich auf einführungs/einsteiger niveau von chapter zu chapter hantel war dein code bewundernswert ... sehr cool

re. vlt etwas tricky - ah wirklich!? hehe


----------



## Xyz1 (9. Apr 2018)

Freut mich, wenn ich Vogan helfen konnte....  Anmerkung: Vergiss die Modifizierer und vernünftige Methodennamen von a und find nich! Auch hilfreich wäre, das Zufallszahlenarray vorher mal auszugeben (das mit'm gleichen Seed möglich, so man es nicht "zwischenspeichern" möchte).


----------



## mrBrown (9. Apr 2018)

Vogan1972 hat gesagt.:


> @DerWissende alter lachs - ich als blutiger anfänger bei dem die Java(9) bücher meiner bibliothek noch keine woche alt sind und ich mich auf einführungs/einsteiger niveau von chapter zu chapter hantel war dein code bewundernswert ... sehr cool
> 
> re. vlt etwas tricky - ah wirklich!? hehe


Als Empfehlung: der "einfache" Code ist meistens besser als der, der besonders trickreich ist 
In dem Fall sollten die weiter oben stehenden Hinweis ausreichend sein, um das umzusetzen.


----------



## Xyz1 (10. Apr 2018)

mrBrown hat gesagt.:


> der "einfache" Code ist meistens besser als der, der besonders trickreich ist


Kannst du das - neuerdings - beurteilen?
Was heißt trickreich? Er soll funktionieren (überdas dokumentiert sein) und den Qualitätskriterien entsprechen. Mehr nicht.
Der von dir angesprochene "einfache Code" funktioniert weder - noch ist er gut.


----------



## Dilara_K (10. Apr 2018)

@DerWissende Dankeschön für dein tipp sehr nett  allerdings ich bin Anfängerin und kenne noch keine Methoden wie Random oder toArray usw. java-Bibliotheken richtig anzuwenden habe ich leider noch nicht drauf Ich hoffe das kommt auch bald.Ich habe das endlich bis auf eine Kleinigkeit auf meine Art und Weise fertig gekriegt. Ich habe nur folgendes Problem bei Array {1,1,2,2,1} output sollte 1 sein aber bei mir kommt 2 raus.Ich weiss ich muss irgendwo eine Zeile ändern aber wo weiss nicht mehr bei anderen Arrays funktioniert das problemlos

```
int firstDuplicate(int[]a) {
       int aktuellerAbstand=0;
       int vorherigeAbstand=0;
       int wertVonElement=-1;
       boolean checkUp=false;
       for(int i=0; i<=a.length; i++){  //dieser for läuft für ein ganzer Array                           
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                 for(int k=i+1; k<=a.length-1; k++){//dieser for läuft nur für ein Element
                             if(a[i]!=a[k]){
                                aktuellerAbstand++;
                             } else
                                   {
                                   wertVonElement=a[i];
                                   }
                 if(aktuellerAbstand==vorherigeAbstand){
                   wertVonElement=a[i];
                   }       
                 } //innere for-schleife endet hier
             
                 if(checkUp==false){
                                vorherigeAbstand=aktuellerAbstand;
                                checkUp=true; 
                 }
       
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
             
             if(aktuellerAbstand<vorherigeAbstand){
                     vorherigeAbstand=aktuellerAbstand;
                     wertVonElement=a[i];
                 } 
       } //die obigste for-schleife endet hier
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      return wertVonElement; 
}
```


----------



## DrZoidberg (10. Apr 2018)

Wenn die Logik einer Methode so komplex wird, dass es schwer fällt den Überblick zu behalten, ist es sinnvoll das Ganze in mehrere Methoden aufzuteilen. Wenn unbedingt alles in eine Methode muss, dann kann man den ganzen Code hinterher wieder in eine einzige M. zurückkopieren, aber das Aufteilen hilft einem erstmal.

Du könntest zum Beispiel eine Methode schreiben, die nur für ein bestimmtes Element an index startIdx, den kleinsten Abstand findet.
_static int firstDuplicate(int[] a, int startIdx)_
In dieser Methode hättest du dann nur eine einzige for Schleife, nämlich die innere. Danach kannst du dann die innere Schleife entfernen und stattdessen in deiner äußeren Schleife die neue Methode aufrufen.


----------



## Xyz1 (10. Apr 2018)

Oder so, die anzahl an Methodenparametern zu reduzieren, ist immer ganz gut....
Nachteilig auch an zu hoher Tiefe von Schleifen ist auch, dass uU gebreakt werden muss....

Und nun zum Code.... Kann den leider kaum lesen.
Und na noch: Öffnende und schließende geschweifte Klammern zu kommentieren -> nie gut, denn deren "Semantik" ist eindeutig.  .... Aber ner Anfängerin ist das fast verzeihbar.


----------



## Dilara_K (11. Apr 2018)

@DrZoidberg  dein Tipp ist sehr gut danke ich werde das umsetzen und so ein mal probieren
@DerWissende ich mach mir die  Kommentare deswegen damit ich ungefähr mir das vorstellen kann wie der code Zeile für Zeile arbeitet. ich habe noch viel zu lernen Wenn ich mein code fertig schreibe und es funktioniert dann poste ich es hier. Ich lerne gerade collections vector u.s.w Ich frage mich ob sowas bei Lösung dieser Aufgabe hilfreich wäre


----------



## Vogan1972 (12. Apr 2018)

@Dilara_K  wenn du mir nicht schon um Lichtjahre voraus sein würdest hätte ich gerne weitere Aufgaben gesehen und gerne versucht sie auch für mich zu lösen... wie lange lernst du Java bereits? (ich alter Depp zwischen den Kidies und kann gerade a bisserl mehr als Hallo Welt! ausgeben, so darf und kann das nicht bleiben ) 

@mrBrown du hast sicher recht aber als ich den Code sah habe ich @DerWissende kurz beneidet und gehofft, wenn auch nur Hobby, mir derartiges auch mal at.hoc einfiele...


----------



## Dilara_K (13. Apr 2018)

@Vogan1972 Ich bin in der 2. Semester Medieninformatik. Angefangen habe ich das Studium ohne irgendwelche Vorkenntnisse.Wir haben in der Studium angefangen mit Hamster-Simulator zu lernen.Jede Woche mussten wir Aufgaben abgeben und wurden im Laboren durch Tutoren betreut.
http://www.java-hamster-modell.de/index2.html Du kannst auf dieser Seite den Simulator und dazugehörige Bücher kostenlos runterladen.Auf der Seite unter der Materiellen findest du noch viel mehr wie Übungsaufgaben mit Lösungen wie zum Bespiel das hier https://lms.bildung-rp.de/austausch/user/policy.php 
 Es gibt noch eine Seite OPEN-HPI da kannst du auch dich kostenlos registrieren und bei den Kursen Java für Anfänger und bei objektorientierte Java-programierung mitmachen alles ist kostenlos. Auf der Seite gibt es nach Erklärvideos Aufgaben online zu lösen. Dann gibt es Seiten wie Coding-Bat. Da gibt es nur Aufgaben online zu lösen.Bevor ich in die Klausur reingegangen bin habe ich dort bisschen trainiert. Bisschen anspruchsvollere Aufgaben findest du unter Codefights. Ich habe  mich dort angemeldet um zu üben.Die Aufgabe die ich nicht lösen konnte stammt von dort.Nach dem du dort eine Aufgabe gelöst hast, kannst du dir die Lösung von anderen anschauen.Du kannst auch jemanden herausfordern oder gegen Firmenbots antreten  Und dass ich im Lichtjahre voraus bin stimmt garnicht  Ich habe auch viele Schwierigkeiten.Im Vorlesung habe ich auch erst nichts verstanden.ich habe mir sehr viel durch Youtoube-videos und tutorials und duch google selbst was beigebracht.Viel wichtiger ist dass man am Ball bleibt!! und zum schluss: "Übung macht den Meister und Probieren geht über Studieren"


----------



## Vogan1972 (13. Apr 2018)

@Dilara_K ich danke dir sehr für deine Antwort(en) ... spitze, ich habe mir alles gebookmark'd und werde versuchen deinen schritten mit YT.Vids unsw zu folgen ... sehr sehr geil, von herzen danke

keine ahnung warum mich die coderei so angefixed hat - den highend gaming pc nutze ich jetzt öfter zum coden lernen (der 3 screens wegen) als zum zocken hahaha


----------



## Dilara_K (13. Apr 2018)

@Vogan1972 gerne sowas freut mich wenn ich helfen kann


----------



## Xyz1 (13. Apr 2018)

Ist ganz gleich wie man lernt....
Dem einen gefallen Viedeotutorials und manch einen sogar eine langweilige Vorlesung.
hasso plattner ist auch gut. 

Falls du noch Tipps brauchst? E'n neues Thema eröffnen!


----------

