Abfrage ob Wert im Array liegt

Kirby.exe

Top Contributor
Gibt es eine Funktion um einen Wert mit einem Array zu vergleichen und zuschauen ob dieser im Array liegt? Es gibt so etwas ja für Strings mit indexOf welcher bei keiner Übereinstimmung ja den Wert -1 liefert. Gibt es so eine ähnliche Funktion auch für Arrays?

Ich liefer mal folgendes Beispiel:

Java:
int array [] = {1,2,3,4};
int input = 2

Ich hatte da an eine If Else gedacht, welche bei einer Übereinstimmung, also wenn es im Array bereits vorkommt mit einer Counter Variable Counter und wenn der Wert noch nicht im Array liegt ihn hineinspeichert.

Java:
if(input in array){
counter += i;
}else{
füge input zum array hinzu
}
 

Kirby.exe

Top Contributor
Also ich glaube ich habe das einlesen der Zahlen für das Array etwas falsch gemacht hier mein Code:

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

public class Statistik {

    public static void main(String[] args) {
        Scanner sc  = new Scanner(System.in);
        System.out.println("Enter the Size of your Array: ");
        int numbersLong = sc.nextInt();
        int numbers [] = new int[numbersLong];
        int counter = 0;
         for(int i = 0;  i < numbers.length; i++) {
            System.out.println("Enter your Number, which you like to add to the Array: ");
             int inputForArray = sc.nextInt();
            
            if(Arrays.binarySearch(numbers,inputForArray) == 0) {
                counter += 1;
            }else {
                numbers[i] = inputForArray;
             }
        }
        sc.close();
        System.out.println(numbers);
        //System.out.println(counter);
    }

}
 

abc66

Top Contributor
Java:
	@SuppressWarnings("resource")
	public static void main(String[] args) {
		System.out.println("Enter the Size of your Array:");
		final int n = new Scanner(System.in).nextInt();
		int[] a = new int[n];
		int c = 0;
		for (int i = 0; i < n; i++) {
			System.out.println("Enter your Number, which you like to add to the Array:");
			int x = new Scanner(System.in).nextInt();
			if (Arrays.stream(a).filter(j -> j == x).findFirst().isPresent()) {
				System.out.println("Array already contains " + x + ".");
				c++;
				i--;
			} else {
				a[i] = x;
			}
		}
		System.out.println("The value of c is " + c + ".");
	}

Nur bei 0 musst aufpassen
 

Kirby.exe

Top Contributor
Oh stimmt daran hatte ich nicht gedacht :) mal noch eine Frage, wenn ich jetzt für jede Zahl die doppelt eingegeben wird speichern möchte wie oft sie doppelt ist, wie mache ich dass, da ja die Größe des Arrays und die Anzahl der Zahlen frei wählbar sind, dann müsste ich ja eine Menge Variablen vorher definen oder gibt es da einen simpleren Weg?
 

Kirby.exe

Top Contributor
Also ich hatte die Idee die doppelten in ein separates Array zu speichern und dann die Zahlen welche doppelt im Array sind zu Zählen und auszugeben das Problem was ich nur habe ist erstmal die geforderte Formatierung und wie ich die 1 für die Zahlen ausgebe die nur 1 mal vorkommen. Ich schicke einfach ein Beispiel das mir gegeben wurde:

12651
 

Kirby.exe

Top Contributor
Also ich habe es so probiert, das Problem was ich versuche zu lösen ist , dass er die doppelte Zahl ja nicht mit zählt da sie nicht ins Array gespeichert werden, jedoch wenn ich es so mache dass sie ins Array gespeichert werden, möchte ich nicht dass diese Eingabe als Eingabe gezählt wird. Ich hoffe du verstehst was ich versuche zu sagen :)

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

public class Statistik {

    @SuppressWarnings("resource")
    public static void main(String[] args) {
        System.out.println("Enter the Size of your Array:");
        final int n = new Scanner(System.in).nextInt();
        int[] numbers = new int[n];
        //int [] counter = new int[20];
        
        Arrays.sort(numbers);
        
        for (int i = 0; i < n; i++) {
            System.out.println("Enter your Number, which you like to add to the Array:");
            int inputToArray = new Scanner(System.in).nextInt();
            int c = 0;
            if (Arrays.stream(numbers).filter(j -> j == inputToArray).findFirst().isPresent()) {
                numbers[i] = inputToArray;
                //c += 1;
                i--;
            } else {
                numbers[i] = inputToArray;
                //c+= 1;
            }
        }
        System.out.println(Arrays.toString(numbers));
        int occurences = 1;
        
        for (int i = 0; i < numbers.length; i++) {
            if (i < numbers.length - 1) {
                if (numbers[i] == numbers[i + 1]) {
                    occurences++;
                }
            } else {
                System.out.println(numbers[i] + " occurs " + occurences
                        + " time(s)"); //end of array
            }

            if (i < numbers.length - 1 && numbers[i] != numbers[i + 1]) {
                System.out.println(numbers[i] + " occurs " + occurences
                        + " time(s)"); //moving to new element in array
                occurences = 1;
            }

        }
        //System.out.println("The value of c is " + c + ".");
        
        //System.out.println(Arrays.toString(numbers));
        //System.out.println(Arrays.toString(counter));
    }


}
 

dirk1970

Mitglied
am einfachsten wäre es eine List<Integer> zu nehmen, die hat eine Methode contains...

wäre dann ungefähr so:
System.out.println("Enter the Size of your Array:");
final int n = new Scanner(System.in).nextInt();
List<Integer>a=new ArrayList<>();
int c = 0;
int i=0;
while (i<n) {
System.out.println("Enter your Number, which you like to add to the Array:");
Integer x = new Integer(new Scanner(System.in).nextInt());
if (a.contains(x)) {
System.out.println("Array already contains " + x + ".");
c++;
} else {
a.add(x);
i++;
}
}
System.out.println("The value of c is " + c + ".");
 

Kirby.exe

Top Contributor
Naja das stimmt ja auch nur möchte ich gerne ausgeben wie oft die einzelnen Zahlen eingegeben wurden nicht nur wie oft generell eine Zahl doppelt eingegeben wurde
 

mihe7

Top Contributor
Ich gehe mal davon aus, dass Arrays verwendet werden müssen. Insofern würde ich empfehlen, das Problem auf zwei Arrays aufzuteilen:
a) ein Array mit bereits behandelten Zahlen (jede Zahl taucht nur einmal dort auf)
b) ein Array, das zu jeder behandelten Zahl die Anzahl enthält
 

dirk1970

Mitglied
ach so, dann ist Array nicht unbedingt die beste Wahl, ich würde an deiner Stelle eine Map verwenden key wäre von Typ Integer die eingegebene Zahl, Value auch Integer die Anzahl wie oft eingegeben

und der Code wäre im etwa so (bei Eingabe von -1 wird die Eingabe beendet, und derzeit mitgezählt, bei Bedarf kannst Du das ja wieder an Deine Bedürfnisse anpassen)

public static void main(String[] args) {
Map<Integer,Integer> eingaben=new HashMap<>();
Integer x=0;
while (!x.equals(-1)) {
System.out.println("Enter your Number, which you like to add to the Array:");
x = new Integer(new Scanner(System.in).nextInt());
Integer count = eingaben.get(x);
if(count==null) {
count=1;
}else {
count++;
}
eingaben.put(x, count);
}
for(Integer key:eingaben.keySet()) {
System.out.println("Wert: "+key+" Anzahl: "+eingaben.get(key));
}
}
 

Kirby.exe

Top Contributor
Wie wäre so etwas:
Java:
import java.util.Scanner;
import java.util.Arrays;

public class Statistik {

    @SuppressWarnings("resource")
    public static void main(String[] args) {
        System.out.println("Enter the Size of your Array:");
        final int n = new Scanner(System.in).nextInt();
        int[] numbers = new int[n];
        int [] counter = new int[n];
        
        Arrays.sort(numbers);
        
        for (int i = 0; i < n; i++) {
            System.out.println("Enter your Number, which you like to add to the Array:");
            int inputToArray = new Scanner(System.in).nextInt();
            if (Arrays.stream(numbers).filter(j -> j == inputToArray).findFirst().isPresent()) {
                counter[i] = inputToArray;
                
                i--;
            } else {
                numbers[i] = inputToArray;
                counter[i] = 1; //für jede Zahl die nur 1 mal vorkommt eine 1 ins Counter Array
            }
        }
        System.out.println(Arrays.toString(numbers));
        System.out.println(Arrays.toString(counter));
        
        //System.out.println("The value of c is " + c + ".");
        
        //System.out.println(Arrays.toString(numbers));
        //System.out.println(Arrays.toString(counter));
    }


}
 

mihe7

Top Contributor
Es reicht nicht festzustellen, ob die Zahl in numbers vorkommt, sondern wo, denn an dieser Stelle findet sich im Array counter der dazugehörige Zähler.
 

Kirby.exe

Top Contributor
Ich glaube ich kann noch nicht ganz nachvollziehen, wie ich dass umsetzen könnte. Soll ich mit dem Index von numbers array arbeiten?
 

mihe7

Top Contributor
Ja. Beispiel:
Code:
numbers[] = {}
counter[] = {}
uniqueNumbers = 0

Eingabe: 3 -> nicht in numbers enthalten -> {
    numbers[uniqueNumbers] = 3; 
    counter[uniqueNumbers] = 1;
    uniqueNumbers++;
}
Eingabe: 1 -> nicht in numbers enthalten -> {
    numbers[uniqueNumbers] = 1; 
    counter[uniqueNumbers] = 1;
    uniqueNumbers++;
}
Eingabe: 3 -> an Position pos=0 in numbers enthalten -> counter[pos]++
Eingabe: 3 -> an Position pos=0 in numbers enthalten -> counter[pos]++
Eingabe: 1 -> an Position pos=1 in numbers enthalten -> counter[pos]++
 

Kirby.exe

Top Contributor
Soweit hab ich es jetzt verstanden, nur was wenn die Zahl zwei mal eingegeben wird, dann müsste der Wert an der Stelle ja ersetzt werden
 

Kirby.exe

Top Contributor
Also das mit dem Ersetzen ist noch etwas provisorisch, überlege gerade wie ich das mit einer Variable Regel:

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

public class Statistik {

    @SuppressWarnings("resource")
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the Size of your Array:");
        final int n = sc.nextInt();
        int[] numbers = new int[n];
        int [] counter = new int[n];
        
        //Arrays.sort(numbers);
        int t = 0;
        for (int i = 0; i < n; i++) {
            System.out.println("Enter your Number, which you like to add to the Array:");
            int inputToArray = sc.nextInt();
            if (Arrays.stream(numbers).filter(j -> j == inputToArray).findFirst().isPresent()) {
                int find = findIndex(numbers, inputToArray);
                counter[find] = 2;
                
                //i--;
            } else {
                numbers[t] = inputToArray;
                counter[t] = 1; //für jede Zahl die nur 1 mal vorkommt eine 1 ins Counter Array
                t++;
            }
        }
        System.out.println(Arrays.toString(numbers));
        System.out.println(Arrays.toString(counter));
        
        //System.out.println("The value of c is " + c + ".");
        
        //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 index = Arrays.binarySearch(arr, t);
        return (index < 0) ? -1 : index;
    }


}
 

mihe7

Top Contributor
1. Such den Index in findIndex selbst raus, denn numbers ist nicht sortiert.
2. Dein if kannst Du ersetzen, wenn nämlich find < 0 gilt, dann wurde die Zahl noch nicht behandelt.
 

Kirby.exe

Top Contributor
Meintest du es so?

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

public class Statistik {

    @SuppressWarnings("resource")
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the Size of your Array:");
        final int n = sc.nextInt();
        int[] numbers = new int[n];
        int [] counter = new int[n];
        

        int t = 0;
        for (int i = 0; i < n; i++) {
            System.out.println("Enter your Number, which you like to add to the Array:");
            int inputToArray = sc.nextInt();
            if (findIndex(numbers, inputToArray) > 0) {
                int find = findIndex(numbers, inputToArray);
                counter[find] = 2;
                
                //i--;
            } else {
                numbers[t] = inputToArray;
                counter[t] = 1; //für jede Zahl die nur 1 mal vorkommt eine 1 ins Counter Array
                t++;
            }
            Arrays.sort(numbers);

        }
        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 index = Arrays.binarySearch(arr, t);
        return (index < 0) ? -1 : index;
    }


}
 

mihe7

Top Contributor
Nicht ganz:
Java:
        int t = 0;
        for (int i = 0; i < n; i++) {
            System.out.println("Enter your Number, which you like to add to the Array:");
            int inputToArray = sc.nextInt();
            int find = findIndex(numbers, inputToArray);
            if (find >= 0) {
 

Kirby.exe

Top Contributor
Bei mir wird als letzter Parameter immer eine 0 ausgegeben also beim Array, da ja numbers[2] bei einer Array länge von 3 und bei einer doppelten Eingabe 0 sein muss. Kann ich das durch eine simple if Else abfangen?
 

mihe7

Top Contributor
Da t die Anzahl der Zahlen enthält:
Java:
numbers = Arrays.copyOf(numbers, t);
counter = Arrays.copyOf(counter, t);
vor der Ausgabe einfügen.
 

mihe7

Top Contributor
Nochmal der Hinweis: schreib Deine findIndex-Methode selber und verzichte auf das Sortieren von numbers (das Problem ist, dass die Reihenfolge von numbers sich ggf. ändert, während die Reihenfolge von counter gleich bleibt).
 

Kirby.exe

Top Contributor
Oke ich überlege mir was :) geht das mit dem ändern der Anzahl so oder ist das falsch?
Java:
if (find >= 0) {
                int c = counter[find];
                counter[find] = c+1;
            }
 

mihe7

Top Contributor
Das ist nicht falsch aber etwas ungeschickt. Die Variable bräuchtest Du schon mal gar nicht:
Java:
counter[find] = counter[find] + 1;

Kürzer:
Java:
counter[find]++;
 

Kirby.exe

Top Contributor
Also ich muss ehrlich sagen ich wüsste nicht wie man den Index abruft :( ich denke mal so einfach wie getIndex() bei ArrayList gibt es nicht
 

Kirby.exe

Top Contributor
Also ich muss ehrlich sagen ich wüsste nicht wie man den Index abruft :( ich denke mal so einfach wie getIndex() bei ArrayList gibt es nicht
 

mihe7

Top Contributor
Also ich muss ehrlich sagen ich wüsste nicht wie man den Index abruft

Funktioniert wie Deine for-Schleife im Code:
Java:
public static int findIndex(int arr[], int t) [
    for (int i = 0; i < arr.length; 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
Mir ist gerade aufgefallen dass er bei einem Test den letzten Wert nicht einließt:

Arraylänge ist 5:
Werte sind: 11,11,12,13,12,11

Woran könnte das liegen?
 

Kirby.exe

Top Contributor
ja aber die doppelten werte sollen von der Zählung ignoriert werden, also wenn die Array länge 3 ist und es 6 Werte gibt dann sind die alle 3 werte doppelt
 

Kirby.exe

Top Contributor
Das wäre das nächste Problem, in der Aufgabenstellung steht, dass die eingaben per Kommandozeilenparameter eingelesen werden, jedoch sind nicht gegeben welche, ist jedoch erstmal nicht so relevant, da es ja einfach eine andere quelle des Input ist oder?
 

mihe7

Top Contributor
Die Kommandozeilenparameter erhälst Du in Form eines String-Arrays als Parameter der main-Methode.

Und relevant ist das natürlich schon: wenn ich es richtig sehe, ist der erste Parameter die Feldgröße und der zweite Paramter der Anzahl der Eingaben. Da hilft es Dir wenig, wenn Du in Deinem Programm sagst: mir doch egal, ich lass mir die Anzahl der Eingaben vom Benutzer mitteilen.
 

Kirby.exe

Top Contributor
ich glaube du hast mich etwas falsch verstanden :) ich meinte zum jetzigen Zeitpunkt ist es doch erstmal egal ob in Eclipse die Werte per Tastatur oder per Kommandozeilenparameter eingelesen werden, ich werde dies dann ändern wenn alles geht :) woran könnte es denn liegen dass das Programm eine Eingabe zu wenig einließt?
 

mihe7

Top Contributor
ich glaube du hast mich etwas falsch verstanden :)
Das ist durchaus möglich :)

ich meinte zum jetzigen Zeitpunkt ist es doch erstmal egal ob in Eclipse die Werte per Tastatur oder per Kommandozeilenparameter eingelesen werden
So lange Du den Code nicht Tests unterziehst, die etwas anderes erwarten.

woran könnte es denn liegen dass das Programm eine Eingabe zu wenig einließt?

Ich wiederhole mich:

Zeig mal Deinen Code. Dann schreib mal, was Du eingibst und was Du als Ausgabe erwartest.
 

Kirby.exe

Top Contributor
Oh sorry war heute morgen noch nicht ganz wach, ich dachte ich hatte ihn direkt mitgeschickt :)

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

public class Statistik {

    @SuppressWarnings("resource")
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the Size of your Array:");
        final int n = sc.nextInt();
        int[] numbers = new int[n];
        int [] counter = new int[n];
        
        //Arrays.sort(numbers);
        int t = 0;
        for (int i = 0; i < n; i++) {
            System.out.println("Enter your Number, which you like to add to the Array:");
            int inputToArray = sc.nextInt();
            int find = findIndex(numbers, inputToArray);
            
            if (find >= 0) {
                counter[find]++;
                i--;
            } 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)
    {
        for (int i = 0; i < arr.length; 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.
    }


}
 

Neue Themen


Oben