Array auf doppelte Zahlen überprüfen

Timo90

Mitglied
Ich möchte ein Programm schreiben, welches 10 Zahlen einliest..., dabei dürfen die Zahlen nur im Bereich von 1-100 liegen und nicht mehrfach vorkommen

Java:
        x= new int[10];

        System.out.println("10 Zahlen eingeben");
        for (int i = 0; i < 10; i++) {
            tipp[i] = algds.IOUtils.readInt();
            if (x[i] >= 1 && x[i] <= 100) {
                continue;
            } else {
                System.out.println("eingebene Zahl nicht korrekt!!!");
                break;
            }
        }

Ich hatte erst daran gedacht ein if Abrage zu machen....if(x!=x[0] && x!=x[1]...), jedoch würde es zu einem Fehler kommen weil x ja auch mit sich selbst überprüft wird...

Ist es auch möglich anstatt des break; eine neue Zahl einzugeben?

Danke!!!
 

noobadix

Bekanntes Mitglied
ArrayList haben die Methode contains(Object o). Die ArrayList kann auch wachsen also könntest du anstelle
for (int i = 0; i < 10; i++) {

while(myArrayList.size()<10)

benutzen
 

noobadix

Bekanntes Mitglied
Java:
import java.util.ArrayList

...

ArrayList<int> x = new ArrayList<int>();

while(x.size()<10){
    int input = algds.IOUtils.readInt();
    if( (!x.contains(input) ){
        if (input>=1 && input <= 100)  x.add(input);
        else System.out.println("fehlerhafte Eingabe <1 oder > 100");
    }
    else System.out.println(input + " schon vorhanden");
}
 
Zuletzt bearbeitet:

noobadix

Bekanntes Mitglied
Wenn es ein Array sein muss:

Java:
x= new int[10];
int index = 0;
int input;
        System.out.println("10 Zahlen eingeben");
        while(x[9] == null) {
            input = algds.IOUtils.readInt();
            if (input >= 1 && input <= 100) {
                for(int i =0;i<x.length;i++){
                    if(x[i]==input){
                        System.out.println("eingebene Zahl schon vorhanden!!!");
                        return;
                    }
                }
                x[index++] = input;
            } else {
                System.out.println("eingebene Zahl nicht korrekt!!!");
            }
        }

edit: unten besprochenen Fehler ausgemerzt
 
Zuletzt bearbeitet:

Timo90

Mitglied
Vielen Dank für die hilfreichen Beiträge!!! Nur nochmal ne Frage bei der ArrayList Variante wird das zweite else mit 'else without if' angemakert, das else wird also nicht mehr dem ersten if zugeordnet...
 

Landei

Top Contributor
Wenn die Reihenfolge nicht wichtig ist, oder man die Zahlen sowieso aufsteigend sortiert haben will, könnte man auch ein Set nehmen (je nachdem HashSet oder TreeSet), da werden Duplikate von vornherein ignoriert. Man müsste also nur solange abfragen, bis size() == 10 ist.
 

noobadix

Bekanntes Mitglied
afaik gibt es in java keine primitiven generics... deshalb nimmt man hier die wrapper-klasse. hättest das programm vllt mal kompilieren sollen ;)

grüße

Ok, hab nicht klar gefragt: Warum eine List gegenüber einer ArrayList besser sei, möcht ich wissen.
Sind die etwa schlanker, weil sie weniger erben?
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Weil List allgemeiner ist. Als Faust- Daumen- oder was-auch-immer-für-ein-Körperteil-Regel: Man sollte immer den Typ verwenden, der gerade so die gestellten Anforderungen erfüllt. Wenn man eine Liste von Zahlen will, dann reicht eine "List". Es ist egal, ob das eine ArrayList oder eine LinkedList oder ein Vector oder irgendeine andere List ist. Wenn man überall nur "List" schreibt, kann man sich später noch aussuchen, welche der konkreten Implementierungen verwenden will (ohne, dass man viel im Code ändern muss)
 

Landei

Top Contributor
Ok, hab nicht klar gefragt: Warum eine List gegenüber einer ArrayList besser sei, möcht ich wissen.
Sind die etwa schlanker, weil sie weniger erben?

Angenommen, du schleifst deine ArrayList durch deine ganze Anwendung, durch alle Parameterlisten, Hecken und Zäune. Und dann brauchst du aus irgendwelchen Gründen plötzlich eine andere Listen-Implementierung. Angenommen du versuchst von verschiedenen Threads auf deine ArrayList zuzugreifen und bekommst deshalb ConcurrentModificationException. Die Lösungen sind so einfach wie vielfältig (Collections.synchronizedList(), Vector, CopyOnWriteArrayList), aber das Problem ist, dass überall "ArrayList" dransteht. Hättest du stattdessen überall "List" stehen, brauchst du nur eine einzige Zeile (nämlich die Erzeugung) zu ändern, der Rest kann einfach so stehenbleiben. Oder mit anderen Worten: Um die Elemente einer Liste durchzugehen, brauchst du gar nicht so genau zu wissen, welche exakte Listen-Implementierung es ist, die Information, dass es eine List ist, reicht aus. Im richtigen Leben interessiert dich auch oft nicht, ob ein Luftballon oder eine Reißzwecke von der Meier- oder Müller GmbH hergestellt worden ist, es ist einfach unwichtig (in einem bestimmten Kontext).
 

noobadix

Bekanntes Mitglied
Ah, verstehe. Also wird das Programm dadurch minimal performanter und der Coder ist flexibel, was die Benutzbarkeit der List betrifft.

Mir ist noch aufgefallen, dass man anstelle for(int i = 0;i<x.length;i++) auch etwas schicker for(int i : x) schreiben könnte.
 

eRaaaa

Top Contributor
Ah, verstehe. Also wird das Programm dadurch minimal performanter und der Coder ist flexibel, was die Benutzbarkeit der List betrifft.

Mir ist noch aufgefallen, dass man anstelle for(int i = 0;i<x.length;i++) auch etwas schicker for(int i : x) schreiben könnte.

/edit: ach das Bezog sich auf deine Schleife, sorry :D
 
Zuletzt bearbeitet:

Timo90

Mitglied
Hallo...ich bins nochmal...

ich habe jetzt eine Methode geschrieben, welche zwei ArrayLists übergeben bekommt und diese auf gemeinsame Zahlen überprüft, ist Zahl a in ArrayList 1 und ArrayList 2, wird x hochgezählt, usw! Außerdem gibt es eine besondere Zahl, wenn diese in ArrayList 1 enthalten ist, wird y auf true gesetzt!

Danach folgen mehrere if-Abfragen...

Java:
  int p = 0;

  if (x == 0 || x == 1) {
            p = 0;
        }
        if (x == 3 && !y) {
            p = 1;
        }
        if (x== 3 && y) {
            p= 2;
        }

und so weiter...
       
        return p;

bei dem return am Ende der Methode scheint es zu einem Fehler zu kommen, p ist immer = 0...

Ich hoffe ihr könnt mir abermals helfen. Danke
 

Marco13

Top Contributor
Du solltest vielleicht nicht beschreiben, was die Methode macht, die du implementiert hast, sondern was die Methode machen soll, die du implementieren wolltest...
 

Timo90

Mitglied
Wie gesagt sollen die beiden ArrayLists auf gemeinsame Zahlen geprüft werden und die Übereinstimmungen sollen gezählt werden. Ist die besondere Zahl vorhanden soll y auf true gesetzt werden.
Gibt es nun 0 oder 1 Übereinstimmungen soll p=0 sein.
Gibt es 3 Übereinstimmungen und ist die besondere Zahlnicht vorhanden soll p=1 sein.
Gibt es 3 Übereinstimmungen und ist die besondere Zahl vorhanden soll p=2 sein.

p soll der return Wert der Methode sein...

Danke
 

eRaaaa

Top Contributor
Das fehlt ja irgendwie komplett bei dir?

Java:
if (x == 0 || x == 1) {
	    return 0;
	} else if (x == 3) {
	    if (y) {
		return 2;
	    } else {
		return 1;
	    }
	} else {
	    return 3;
	}

/edit: Warum so Teufel formatiert der den JavaCode in letzter Zeit bei mir so komisch? :bahnhof:
 

Timo90

Mitglied
Nach
Java:
else {
        return 3;
    }

würde ja noch mal zum Ende der Methode "}" folgen, anschließend kommt der Fehler missing return statement!!!
 

Timo90

Mitglied
Hat sich erledigt...habe die Klammern weggelassen und return Zahl immer durch p=Zahl; ersetzt und am Ende return p; geschrieben und es läuft :)
 

Marco13

Top Contributor
Diese "magischen" Zahlen sind ziemlich schlecht. Definier' dir lieber Konstanten

private static final int CONTAIN_COMMON_ELEMENTS = 0;
private static final int CONTAINS_SPECIAL_ELEMENT = 1;
...

Und gib DIE dann in der Methode zurück...
 

Neue Themen


Oben