Abfrage ob Wert im Array liegt

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)
 
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.
 
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).
 
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]
 
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
 
Nein, der Test erwartet kein Komma, sondern keine eckigen Klammern. Du hast aktuell Arrays.toString() verwendet und das sollst Du offensichtlich nicht tun 🙂
 
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
 
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
 
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.
 
Gründe... also im Code von vorhin kann ich auf die Schnelle keinen Fehler sehen. Vielleicht ist Deine Ausgabefunktion falsch?
 
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]);
 
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.
 
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.
    }


}
 
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:
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


Zurück
Oben