Abfrage ob Wert im Array liegt

Kirby.exe

Top Contributor
Also es gibt 3 Tests:


Test 1:
Eingabe: 11,11,12,13,12,11
Array-Größe: 5
Ausgabe: 11 kommt 3 mal vor, 12 kommt 2 mal vor und 13 kommt einmal vor

Test 2:
Eingabe: 1,3,1,2,1
Array-Größe: 3
Ausgabe: 1 kommt 3 mal vor, 3 kommt 1 mal vor und 2 kommt 1 mal vor

Test 3:
Eingabe: 13, 13, 11, 43, 2, 13, -2, -2, -2, 53, 11, 29, 7, 13, 19, 29, 0, 13
Array-Größe: 21
Ausgabe: 13(5 mal), 11(2 mal), 43(1mal), 2(1mal), -2(3mal), 53(1mal), 29(2mal), 7(1mal), 19(1mal),0(1mal)
 

mihe7

Top Contributor
Du gibst also beim ersten Test auf die Frage: "Enter the Size of your Array:" die Zahl 5 ein. Danach liest Du eben 5 Werte ein. Wo soll denn der sechste herkommen? In den Tests, die Du in #44 gepostet hast, gibt es einen zweiten Parameter: 6; der taucht bei Dir im Code nirgends auf.
 

mihe7

Top Contributor
6 steht für die Anzahl der Werte welche eingelesen werden
Nochmal: in Deinem Code kommt diese Variable nirgends vor. Du fragst nach der Größe des Arrays und liest genau so viele Werte ein. Du brauchst noch eine Abfrage, wie viele Werte eingelesen werden sollen und musst die for-Schleife dann entsprechend anpassen (also bis zu dem dort eingegebenen Wert laufen).
 

Kirby.exe

Top Contributor
Naja ich muss ehrlich zugeben, dass ich mit Kommandozeilenparametern nicht so viel Erfahrung habe, aber in vorherigen Aufgaben hatten wir die meistens gegeben, so etwas wie args[0] und args[1]
 

Kirby.exe

Top Contributor
Ok ich hab einfach mal args[0] und args[1] ausprobiert und eigentlich kommt auch das richtige raus, nur erwartet der Test irgendwie ein (,) ?

12662
 

mihe7

Top Contributor
Nein, der Test erwartet kein Komma, sondern keine eckigen Klammern. Du hast aktuell Arrays.toString() verwendet und das sollst Du offensichtlich nicht tun :)
 

Kirby.exe

Top Contributor
Ok habe die Print Method mit einer For Schleife gemacht anstatt mit Array.toString :) Wie könnte ich es abfangen, dass eine 0 als eingäbe nicht gelöscht wird von
numbers = Arrays.copyOf(numbers, t);
ich überlege schon die ganze Zeit ob man das anders machen kann, weil irgendwie müssen ja die Leerstellen im Array gelöst werden, aber die Methode kann ja nicht einfach so zwischen einer Leerstelle im Array und der eingabe 0 unterscheiden
 

Kirby.exe

Top Contributor
Naja also ohne die Funktion sähe das Array ja so aus 3,1,2,0,0,0,0,0 und die Funktion copyOf schneidet die 0 weg, jedoch gibt es beim 3. Test eine 0 als eingäbe
 

mihe7

Top Contributor
Die Funktion copyOf schneidet nichts weg, sondern liefert ein Array der Länge t als Kopie der ersten t Elemente des gegebenen Arrays. Ob in der Eingabe eine 0 vorkommt, oder nicht, spielt doch im Programm gar keine Rolle.
 

mihe7

Top Contributor
Gründe... also im Code von vorhin kann ich auf die Schnelle keinen Fehler sehen. Vielleicht ist Deine Ausgabefunktion falsch?
 

Kirby.exe

Top Contributor
Java:
for(int i=0; i < numbers.length-1; i++) {
            System.out.print(numbers[i] + ", ");
        }
        System.out.print(numbers[numbers.length-1] + "\n");
        
        for(int i=0; i < counter.length-1; i++) {
            System.out.print(counter[i] + ", ");
        }
        System.out.print(counter[counter.length-1]);
 

mihe7

Top Contributor
Das ist zwar etwas kompliziert geschrieben, dürfte aber passen. Wie kommst Du darauf, dass die 0 weggelassen wird?
 

mihe7

Top Contributor
Ach so, jetzt sehe ich das erst: in dem Test geht es darum, dass mehr Elemente in der Ausgabe gefordert werden, als eigentlich notwendig sind :)

Du musst also nicht Arrays.copyOf(numbers, t) sondern Arrays.copyOf(numbers, anzahlGeforderterElemente) verwenden, analog für counter.
 

mihe7

Top Contributor
OK, Problem erkannt. findIndex durchsucht das komplette Array und findet daher die 0, obwohl die noch gar nicht erfasst wurde.

Java:
import java.util.Scanner;
import java.util.Arrays;

public class Statistik {

    @SuppressWarnings("resource")
    public static void main(String[] args) {
        int n = Integer.parseInt(args[0]);
        int m = Integer.parseInt(args[1]);

        int[] numbers = new int[n];
        int [] counter = new int[n];

        Scanner sc = new Scanner(System.in);        
        //Arrays.sort(numbers);
        int t = 0;
        for (int i = 0; i < m; i++) {
            int inputToArray = sc.nextInt();
            int find = findIndex(numbers, inputToArray, t);

            if (find >= 0) {
                counter[find]++;
            } else {
                numbers[t] = inputToArray;
                counter[t] = 1; //für jede Zahl die nur 1 mal vorkommt eine 1 ins Counter Array
                t++;
            }
        }
        numbers = Arrays.copyOf(numbers, t);
        counter = Arrays.copyOf(counter, t);
        System.out.println(Arrays.toString(numbers));
        System.out.println(Arrays.toString(counter));
    }
    
    // Function to find the index of an element
    public static int findIndex(int arr[], int t, int n)
    {
        for (int i = 0; i < n; i++) {
            if (arr[i] == t) { // ist das (i+1)-te Element aus arr gleich t?
                return i;      // dann gib den Index i zurück
            }
        }
        return -1; // t nicht gefunden -> -1 zurück.
    }


}
 

Kirby.exe

Top Contributor
Funktioniert alles Danke :) Könntest du mir trotzdem nochmal erklären warum es an der 0 gescheitert ist, nur damit ich mir den Fehler einpräge :) Nevermind habe verstanden warum
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Klar: Wenn Du ein neues Array initialisierst, sind die Werte erstmal alle 0.

Jetzt gibst Du erstmals eine 0 ein und suchst in dem Array danach. Nachdem die Werte alle 0 sind, wirst Du auch fündig, obwohl die 0 noch nie verarbeitet wurde.

Abhilfe schafft man dadurch, dass man der Suchmethode mitgibt, wie viele Elemente man tatsächlich schon in das Array gesteckt hat. Das ist der neue, dritte Parameter von findIndex.
 

Neue Themen


Oben