User Tag List

Ergebnis 1 bis 11 von 11

Thema: Java Programm zum Finden doppelter Werte in einem Array

  1. #1
    Super-Moderator Avatar von DaEngineer
    Registriert seit
    23.06.2010
    Beiträge
    1.544
    Blog-Einträge
    2
    Renommee-Modifikator
    20

    Java Programm zum Finden doppelter Werte in einem Array

    Hallo Mädels,

    ich sitze gerade mit einem Kumpel an einem einfachen Java Programm. Wir sind beide neu in der Materie und tasten uns jetzt schrittweise ran. Das Programm soll ein Array auf doppelt vorkommende Zahlen überprüfen und bei Übereinstimmung true ausgeben, andernfalls false.

    Das Programm sieht folgendermaßen aus und funktioniert auch:

    Code:
    package uebung;
    
    public class Mehrfach
    {
    
        public static void main(String[] args)
        {
            int[] array = {1, 2, 5, 9, 11, 3};
            rechnung(array);
    
        }
        
        public static void rechnung(int[] array)
        {
            int i = 0;
            int k = 0;
            boolean mehrfach = false;
            
            while (i < array.length)
            {
                while (k < array.length)
                {
                    if (i == k)
                    {
                        k=k+1;
                    }
                    if (array[i] == array[k])
                    {
                        mehrfach = true;
                        System.out.println(array[i]+" gleich "+array[k]+" "+mehrfach);
                        mehrfach = false;
                    }
                    System.out.println(array[i]+" gleich "+array[k]+" "+mehrfach);
                    k=k+1;
                }
                i=i+1;
                k=0;
            }
        }
    }
    Allerdings gibt die Konsole mehrere Fehlermeldungen aus, die immer an verschiedenen Stellen der Ausgabe stehen (bis auf Java Result:1, das steht immer ganz zuletzt). Diese lauten:

    • Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
    • at uebung.Mehrfach.rechnung(Mehrfach.java:27)
    • at uebung.Mehrfach.main(Mehrfach.java:9)
    • Java Result: 1

    Die zweite Fehlermeldung verweist auf die Zeile if (array[i] == array[k]), die dritte auf rechnung(array);


    Das Programm funktioniert wie gesagt tadellos und gibt diese Ausgabe hier als Lösung zurück:

    Spoiler:
    1 gleich 2 false
    1 gleich 5 false
    1 gleich 9 false
    1 gleich 11 false
    1 gleich 3 false
    2 gleich 1 false
    2 gleich 5 false
    2 gleich 9 false
    2 gleich 11 false
    2 gleich 3 false
    5 gleich 1 false
    5 gleich 2 false
    5 gleich 9 false
    5 gleich 11 false
    5 gleich 3 false
    9 gleich 1 false
    9 gleich 2 false
    9 gleich 5 false
    9 gleich 11 false
    9 gleich 3 false
    11 gleich 1 false
    11 gleich 2 false
    11 gleich 5 false
    11 gleich 9 false
    11 gleich 3 false
    3 gleich 1 false
    3 gleich 2 false
    3 gleich 5 false
    3 gleich 9 false
    3 gleich 11 false


    Nur was hat es mit den Fehlermeldungen auf sich?
    Geändert von DaEngineer (26.09.2011 um 15:22:31 Uhr)

  2. #2
    Moderator Avatar von Campeòn
    Registriert seit
    20.06.2010
    Ort
    Bielefeld
    Beiträge
    2.176
    Blog-Einträge
    1
    Renommee-Modifikator
    19
    Die Fehlermeldung beschreibt sich bereits selbst:

    •Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6

    Array Index Out Of Bounds Exception, das Programm versucht auf eine Stelle des Arrays zuzugreifen, der gar nicht existiert. Euer Array ist 6 lang, also die Index Werte 0-5, im letzten Durchlauf versucht ihr allerdings auf array[6] zuzugreifen, was eine Exception zur Folge hat.

    • at uebung.Mehrfach.rechnung(Mehrfach.java:27)
    • at uebung.Mehrfach.main(Mehrfach.java:9)

    Das zeigt nur, wo die Exception auftritt. Wenn ihr nicht wisst was eine Exception ist, googlen.


    Die Ursache des Problems ist:

    Im letzten Durchlauf, wenn i=5 ist, und k in der inneren while Schleife soweit hochgezählt wurde, dass sie auch 5 ist (also der letzte durchlauf), dann kommt am Anfang der Inneren Schleife die if Abfrage mit dem if (i == k) zu tragen und k wird nochmal ein hochgezählt auf k=6. Danach versucht er dann die Arraywerte zu vergleichen if (array[i] == array[k]), da k aber 6 ist und somit gräßer als das Array, kommt der Fehler. Überdenkt das Programm einfach nochmal wenn ihr Hilfe braucht sagt bescheid.

    Kleine Schreibhilfte, anstelle von k=k+1; einfach k++; schreiben.
    Because we do not know when we will die, we get to think of life as an inexhaustible well, and yet everything happens only a certain number of times ... And a very small number really. How many more times will you remember a certain afternoon of your childhood ... an afternoon that is so deeply a part of your being that you can't even conceive of your life without it? Perhaps four or five times more. Perhaps not even that. How many more times will you watch the full moon rise? Perhaps 20. And yet it all seems limitless.

  3. #3
    Super-Moderator Avatar von DaEngineer
    Registriert seit
    23.06.2010
    Beiträge
    1.544
    Blog-Einträge
    2
    Renommee-Modifikator
    20
    Danke für den Hinweis Wir sind nicht drauf gekommen, dass das Array im letzten Schritt überschritten wird. Unsere Lösung haben wir in die innere while Schleife eingebaut:

    Code:
    while (k < array.length)
                {
                    if (i == k)
                    {
                        if (k == array.length-1)
                        {
                            break;
                        }
                        k++;
                    }
    Gut zu wissen, dass du davon Ahnung hast. Da wir beide am 10.10.2011 mit unserem Informatikstudium anfangen, könnte es sein, dass ich hier noch den ein ander anderen Java (Sammel-)thread eröffnen werde

  4. #4
    Moderator Avatar von Campeòn
    Registriert seit
    20.06.2010
    Ort
    Bielefeld
    Beiträge
    2.176
    Blog-Einträge
    1
    Renommee-Modifikator
    19
    Ja cool, endlich mehr Java Leute im Forum. Die Grundlagen habe ich drauf, der richtige Experte hier ist wohl nur Jodokus.

    Ich würde eurer Programm übrigends so machen, ist ein bisschen simpler:
    Code:
    public class Testmb {
    
        public static void main(String[] args) {
            int[] array = {1, 2, 5, 9, 11, 3};
            rechnung(array);
        }
    
        public static void rechnung(int[] array) {
            for (int i = 0; i < array.length; i++) {
                for (int j = 0; j < array.length; j++) {
                    if (i != j) {
                        System.out.println(array[i] + " gleich " + array[j] + " " + (array[i] == array[j]));
                    }
                }
            }
        }
    }
    Geändert von Campeòn (26.09.2011 um 17:41:21 Uhr)
    Because we do not know when we will die, we get to think of life as an inexhaustible well, and yet everything happens only a certain number of times ... And a very small number really. How many more times will you remember a certain afternoon of your childhood ... an afternoon that is so deeply a part of your being that you can't even conceive of your life without it? Perhaps four or five times more. Perhaps not even that. How many more times will you watch the full moon rise? Perhaps 20. And yet it all seems limitless.

  5. #5
    Super-Moderator Avatar von DaEngineer
    Registriert seit
    23.06.2010
    Beiträge
    1.544
    Blog-Einträge
    2
    Renommee-Modifikator
    20
    Oh mann, nicht schlecht. Im ersten Moment dachte ich, das wäre nur deine Empfehlung für den kleinen Teil, den ich jetzt noch angefügt habe, aber das ist ja tatsächlich der gesamte Code Die for Bedingung kannten wir beide noch nicht, aber dank dieser Seite hier war deine Lösung wirklich sehr einleuchtend. Danke nochmal dafür

  6. #6
    Mitglied Avatar von SirK
    Registriert seit
    09.01.2011
    Ort
    Mannheim
    Beiträge
    250
    Renommee-Modifikator
    8
    Jaja die liebe forschleife

    wie fangt ihr denn an mit java? wollte mir das auch schon ewig zu gemüte führen. wenn ich mir den code so anschaue
    sieht das ja fast aus wie c#
    habts ihr da irgendwie ne tutorial seite so von 0 auf 100 oder so?

  7. #7
    Erfahrenes Mitglied Avatar von Ikontflash
    Registriert seit
    20.06.2010
    Ort
    Oldenburg
    Alter
    23
    Beiträge
    769
    Renommee-Modifikator
    10
    Gott soll Himmel und Erde an 7 Tagen erschaffen haben...
    Unmöglich! So schnell mappen kann keiner.

  8. #8
    Super-Moderator Avatar von DaEngineer
    Registriert seit
    23.06.2010
    Beiträge
    1.544
    Blog-Einträge
    2
    Renommee-Modifikator
    20
    Wir haben mit den Java Tutorials von Bucky angefangen *link*. Der Kerl erklärt alles vom Installieren des Toolkits an haarklein, sehr amüsant und sehr zugänglich. Insgesamt gib es an die 100 Tutorials in Videoform nur über Java, und dann noch zusätzliche Videos für Java Game Development. Ansonsten gehen wir noch in den Vorkurs an der Uni, der momentan läuft.

  9. #9
    Mapping-Profi Avatar von eMo
    Registriert seit
    10.12.2010
    Beiträge
    2.020
    Renommee-Modifikator
    18
    Die Frage ist eigentlich, ob das nicht schneller als in Quadratzeit geht
    Aber ich glaube nicht, dass das ohne zu sortieren möglich ist.

    Wo fangt ihr denn das Studium an?
    Ein kreativer Geist findet immer eine Möglichkeit, sich auszuleben.

  10. #10
    Moderator Avatar von Campeòn
    Registriert seit
    20.06.2010
    Ort
    Bielefeld
    Beiträge
    2.176
    Blog-Einträge
    1
    Renommee-Modifikator
    19
    Mh, man könnte es aber tatsächlich noch verkürzen. So vergleicht er keine Zahlen mehr als einmal und man erspart sich die if Abfrage.

    Code:
        public static void rechnung(int[] array) {
            for (int i = 0; i < array.length; i++) {
                for (int j = i+1; j < array.length; j++) {
                        System.out.println(array[i] + " gleich " + array[j] + " " + (array[i] == array[j]));
                }
            }
        }
    Because we do not know when we will die, we get to think of life as an inexhaustible well, and yet everything happens only a certain number of times ... And a very small number really. How many more times will you remember a certain afternoon of your childhood ... an afternoon that is so deeply a part of your being that you can't even conceive of your life without it? Perhaps four or five times more. Perhaps not even that. How many more times will you watch the full moon rise? Perhaps 20. And yet it all seems limitless.

  11. #11
    Super-Moderator Avatar von DaEngineer
    Registriert seit
    23.06.2010
    Beiträge
    1.544
    Blog-Einträge
    2
    Renommee-Modifikator
    20
    Entschuldigt die späte Antwort...

    Zitat Zitat von eMo Beitrag anzeigen
    Wo fangt ihr denn das Studium an?
    An der Technischen Universität Dortmund.


    Zitat Zitat von Campeòn Beitrag anzeigen
    Mh, man könnte es aber tatsächlich noch verkürzen. So vergleicht er keine Zahlen mehr als einmal und man erspart sich die if Abfrage.

    Code:
        public static void rechnung(int[] array) {
            for (int i = 0; i < array.length; i++) {
                for (int j = i+1; j < array.length; j++) {
                        System.out.println(array[i] + " gleich " + array[j] + " " + (array[i] == array[j]));
                }
            }
        }
    Nicht schlecht Ich merk schon, hier bin ich gut aufgehoben, wenn ich mal Codinghilfe brauche.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  
[email protected]