# Array auf doppelte Zahlen überprüfen



## Timo90 (9. Jan 2010)

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


```
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 (9. Jan 2010)

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 (9. Jan 2010)

```
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");
}
```


----------



## eRaaaa (9. Jan 2010)

ArrayList<int> x ???:L

wenn dann doch eher ArrayList<Integer> x ,
noch besser ist allerdings List<Integer> x = ...


----------



## noobadix (9. Jan 2010)

Wenn es ein Array sein muss:


```
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


----------



## eRaaaa (9. Jan 2010)

while(x.length<10)

sobald du ein Array mit new initialisierst, hat es die Länge 10 

Sorry


----------



## noobadix (9. Jan 2010)

Äh! dass ja auch wieder quatsch: (while x.length<10)

richtig: while (x[9] == null)


----------



## noobadix (9. Jan 2010)

Bin doch immer für konstruktive hilfe zu haben xD


----------



## noobadix (9. Jan 2010)

eRaaaa hat gesagt.:


> ArrayList<int> x ???:L
> 
> wenn dann doch eher ArrayList<Integer> x ,
> noch besser ist allerdings List<Integer> x = ...



Warum ist das besser?


----------



## Timo90 (9. Jan 2010)

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...


----------



## noobadix (9. Jan 2010)

Ups die x-te: Hab ich korrigiert, da fehlte ne Klammer.


----------



## Landei (10. Jan 2010)

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.


----------



## nrg (11. Jan 2010)

noobadix hat gesagt.:


> eRaaaa hat gesagt.:
> 
> 
> > ArrayList<int> x ???:L
> ...



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


----------



## noobadix (11. Jan 2010)

nrg hat gesagt.:


> 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?


----------



## Marco13 (11. Jan 2010)

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 (11. Jan 2010)

noobadix hat gesagt.:


> 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 (11. Jan 2010)

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.


----------



## faetzminator (11. Jan 2010)

noobadix hat gesagt.:


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



Nein und ja, es ist wirklich nur schönes OOP


----------



## eRaaaa (11. Jan 2010)

noobadix hat gesagt.:


> 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


----------



## Timo90 (11. Jan 2010)

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...


```
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 (11. Jan 2010)

Du solltest vielleicht nicht beschreiben, was die Methode _macht_, die du implementiert _hast_, sondern was die Methode machen _soll_, die du implementieren _wolltest_...


----------



## Timo90 (11. Jan 2010)

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 (11. Jan 2010)

Und was soll zurückgegeben werden, wenn keine der Bedingungen zutrifft?


----------



## Timo90 (11. Jan 2010)

Dann soll eine 3 zurückgegeben werden...


----------



## eRaaaa (11. Jan 2010)

Das fehlt ja irgendwie komplett bei dir?


```
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 (11. Jan 2010)

Nach

```
else {
        return 3;
    }
```

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


----------



## eRaaaa (11. Jan 2010)

Ich steig nicht mehr durch. Zeig uns mal die komplette Methode


----------



## Timo90 (11. Jan 2010)

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 (11. Jan 2010)

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...


----------

